
- 发布:2023-09-13 16:03
- 更新:2024-10-15 12:38
- 阅读:2299
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
HBuilderX类型: 正式
HBuilderX版本号: 3.8.12
手机系统: 全部
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
测试过的手机:
示例代码:
以下示例代码为官方文档中例子。
uni.login({
provider: 'google',
success: function (loginRes) {
// 登录成功
uni.getUserInfo({
provider: 'google',
success: function(info) {
console.warn('res:',loginRes,info)
// 获取用户信息成功, info.authResult保存用户信息
}
})
},
fail: function (err) {
console.warn('err:',err)
// 登录授权失败
// err.code是错误码
}
});
以下示例代码为官方文档中例子。
uni.login({
provider: 'google',
success: function (loginRes) {
// 登录成功
uni.getUserInfo({
provider: 'google',
success: function(info) {
console.warn('res:',loginRes,info)
// 获取用户信息成功, info.authResult保存用户信息
}
})
},
fail: function (err) {
console.warn('err:',err)
// 登录授权失败
// err.code是错误码
}
});
操作步骤:
分别在Android和ios设备上执行以上谷歌第三方登录操作
分别在Android和ios设备上执行以上谷歌第三方登录操作
预期结果:
预期是Android端能正确返回access_token
预期是Android端能正确返回access_token
实际结果:
实际情况,android设备未返回access_token,ios设备返回了access_token。
实际情况,android设备未返回access_token,ios设备返回了access_token。

简约_FE (作者)
临时解决方案:
按以下下方式可以直接拿到id_token和code(授权代码)。
服务端再用授权代码来刷新令牌和访问令牌:
https://developers.google.cn/identity/protocols/oauth2/web-server?hl=zh-cn#exchange-authorization-code
最终能拿到access_token、id_token.
web_client_id 到凭证控制台获取 https://console.developers.google.com/apis/credentials?hl=zh-cn
//初始化
var mainActivity = plus.android.runtimeMainActivity();
var GoogleSignInOptions = plus.android.importClass("com.google.android.gms.auth.api.signin.GoogleSignInOptions");
var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken('web_client_id')
.requestServerAuthCode('web_client_id')
.requestEmail()
.requestProfile()
.build();
//创建GoogleClient
var GoogleSignIn = plus.android.importClass("com.google.android.gms.auth.api.signin.GoogleSignIn");
var mGoogleClient = GoogleSignIn.getClient(mainActivity,gso)
var signInIntent =plus.android.invoke(mGoogleClient,'getSignInIntent')
//跳转登录
var CODE_REQUEST = 200;
mainActivity.startActivityForResult(signInIntent, CODE_REQUEST);
//获取登录回调
mainActivity.onActivityResult = function(requestCode, resultCode, data) {
if (requestCode==CODE_REQUEST){
var GoogleSignIn = plus.android.importClass("com.google.android.gms.auth.api.signin.GoogleSignIn");
var account = new GoogleSignIn().getLastSignedInAccount(mainActivity)
console.log(plus.android.invoke(account,'getId'),'===','unionid,openid')
console.log(plus.android.invoke(account,'getEmail'),'===','email')
console.log(plus.android.invoke(account,'getDisplayName'),'===','nickname')
console.log(plus.android.invoke(account,'getIdToken'),'===','idToken')
console.log(plus.android.invoke(account,'getServerAuthCode'),'===','code,这个是关键code,传递到服务端换access_token令牌')
console.log((plus.android.invoke(account,'getPhotoUrl')||'').toString(),'===','avatarUrl')
}
}

web_client_id注意替换,代码不可直接复制使用
形如:
.requestIdToken('XXXXXXXXXXXXX.apps.googleusercontent.com')
.requestServerAuthCode('XXXXXXXXXXXXX.apps.googleusercontent.com')

我也遇到了这个问题, iOS的Google登录有access_token, 但Android上面没有.
我的想法是, iOS上的Google登录等于是跳出来一个Google的页面进行登录, 但是Android上的Google有点像是一个登录插件的样子. 虽然没有access_token, 但可以用uni.getUserInfo获取到了Google账户的用户信息.
再结合官网教程https://uniapp.dcloud.net.cn/tutorial/app-oauth-google.html, 这里明确提到了 "Android平台不需要客户端ID", 而且教程下面示例代码也是调用uni.login后就调用uni.getUserInfo.
所以我认为Android的Google登录就相当于完全在前端做完了Google登录的验证.
-
这个问题解决了没。我也是。一直拿不到。ios可以。Android死活就是拿不到。uni.login和5+app的方式我都试过了。都是拿不到的。楼主你这个解决了没
2024-12-10 17:07
-
-
回复 慕斯船长: 但是。我们拿不到接口的token呀。我们前端登录成功了。接口不知道。和接口的通信就是要token的呀。也不能用,用户的邮箱再去接口换取token。很不安全的。
2024-12-17 10:25
1***@qq.com
通过这个方法IDToken跟code都是null是怎么回事呢
2023-11-30 14:38
3***@qq.com
回复 1***@qq.com: 有没有替换web_client_id?看我下面的代码
2023-12-01 16:20
1***@qq.com
这么写能拿到IDToken和code,但是第二次点击的时候,不会唤起谷歌登录了,这个有办法解决吗?
2024-01-05 13:37
1***@qq.com
回复 1***@qq.com: 第二次点击的时候,直接登录上次的账号了。
2024-01-05 14:22
1***@qq.com
回复 1***@qq.com: 解决了,下面新增 plus.android.invoke(mGoogleClient, 'signOut')
退出google登录,下次点击还会唤起google
2024-01-06 16:59
木木_D
回复 1***@qq.com: 你好,请问你换成自己的id就可以用了吗?我试了下还是null呢
2024-02-05 14:49
d***@dahsolar.com
贴主,这个问题我这打印所有值都是null,是因为什么呀,web_client_id申请的有问题吗,求解,感谢感谢
2024-03-07 15:50