简约_FE
简约_FE
  • 发布:2023-09-13 16:03
  • 更新:2024-10-15 12:38
  • 阅读:2299

【报Bug】uni.login在APP端google登录返回的access_token不一致

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10

HBuilderX类型: 正式

HBuilderX版本号: 3.8.12

手机系统: 全部

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

测试过的手机:

iphone6,小米10

示例代码:

以下示例代码为官方文档中例子。

                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端能正确返回access_token

实际结果:

实际情况,android设备未返回access_token,ios设备返回了access_token。

bug描述:

文档参考:
https://uniapp.dcloud.net.cn/tutorial/app-oauth-google.html

使用文档提供的示例代码,进行Google登录,登录成功后,发现Android和ios两端返回的access_token结果不一致

附件为运行结果对比:

Android端运行结果:


ios端运行结果:

2023-09-13 16:03 负责人:无 分享
已邀请:
简约_FE

简约_FE (作者)

临时解决方案:

按以下下方式可以直接拿到id_tokencode(授权代码)
服务端再用授权代码来刷新令牌和访问令牌:
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')   
       }  
}
  • 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

3***@qq.com

3***@qq.com

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

  • 木木_D

    大佬、请问可以加一个联系方式咨询一下谷歌登录的问题吗

    2024-02-05 10:45

  • d***@dahsolar.com

    我这打印所有值都是null,怎么解决呢

    2024-03-07 15:54

d***@qq.com

d***@qq.com

关键点是填的id是web端的id 不是安卓端

7***@qq.com

7***@qq.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登录的验证.

  • s***@126.com

    这个问题解决了没。我也是。一直拿不到。ios可以。Android死活就是拿不到。uni.login和5+app的方式我都试过了。都是拿不到的。楼主你这个解决了没

    2024-12-10 17:07

  • 慕斯船长

    回复 s***@126.com: 虽然没拿到但是返回了Google账户的用户信息, 这不就等于拿到了么, 不再需要后端再做验证了

    2024-12-13 01:42

  • s***@126.com

    回复 慕斯船长: 但是。我们拿不到接口的token呀。我们前端登录成功了。接口不知道。和接口的通信就是要token的呀。也不能用,用户的邮箱再去接口换取token。很不安全的。

    2024-12-17 10:25

要回复问题请先登录注册