uni-app集成的谷歌登录,iOS返回accessToken,Android通过原生插件获取的是idToken值,后期可以优化一下吗?

发布于 1周前 作者 bupafengyu 来自 uni-app

uni-app集成的谷歌登录,iOS返回accessToken,Android通过原生插件获取的是idToken值,后期可以优化一下吗?

问题描述

App端:

现在框架上集成的谷歌登录,iOS返回accessToken(原生可以得到idToken值)

Android只有openid,unionid(通过getUserInfo可以得到邮箱,昵称等值, 通过原生插件获取的是idToken值)

两个参数值不一样,

accessToken: ya29.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

idToken: eyJhbGcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

对接接口时需要与后台沟通出两套验证逻辑 。。。(原生做App的只需要一套)

后期可以优化一下吗,iOS和Android都返回idToken值


8 回复

我这边接入谷歌登录的时候报错了:12501/16,请问你创建google oauth2的时候sha1填的是打包的时候对应证书的sha1么? 我基座选的是云端证书,然后配置的是dcloud后台的证书管理里的sha1,点击google弹层选账户或者新增账户都没有反应


我用的是自有证书,用的firebase,在firebase里面创建Android项目时需要填写sha1值,这个是谷歌登录的时候必须填写sha1值,其他的没有了

回复 Anet: 我这边选完账号以后就没反应了,再点返回就报错了,不知道你有没有遇到过这种情况?

回复 pudding_18: 没有遇到这种情况

我现在拿到谷歌返回的openid,unionid,没有返回accesstoken你们是怎么解决的呀?

如何获取idtoken

您好,我想问一下,我ios接入google登录报错{ “errMsg”: “login:fail 无效的参数,https://ask.dcloud.net.cn/article/282”, “errCode”: -1, “code”: -1 },能进入到google的页面,但是登录不了

针对您提到的uni-app集成谷歌登录时,iOS和Android平台返回不同令牌(iOS返回accessToken,Android通过原生插件返回idToken)的问题,确实可以通过一些技术手段进行统一处理或优化。以下是一个简要的代码示例和优化思路,旨在展示如何在uni-app中处理这种情况,并确保两端返回的数据格式一致。

1. 统一接口设计

首先,在uni-app中定义一个统一的登录接口,用于处理不同平台的登录逻辑。

// login.js
export function googleLogin() {
    return new Promise((resolve, reject) => {
        #ifdef APP-PLUS
        if (uni.getSystemInfoSync().platform === 'ios') {
            // iOS平台使用uni-app提供的API或原生模块获取accessToken
            uni.login({
                provider: 'google',
                success: (res) => {
                    if (res.code) {
                        // 假设这里获取到的是accessToken
                        resolve({ tokenType: 'accessToken', token: res.code });
                    } else {
                        reject(res.errMsg);
                    }
                },
                fail: reject
            });
        } else {
            // Android平台使用原生插件获取idToken
            plus.oauth.getAccessToken({
                service: 'google',
                success: (e) => {
                    if (e.access_token) {
                        // 注意:这里可能需要转换或处理,因为Android原生返回的是idToken
                        // 假设通过某种方式转换或确认其为有效令牌
                        resolve({ tokenType: 'idToken', token: e.access_token }); // 这里可能需要根据实际情况调整
                    } else {
                        reject(e.msg);
                    }
                },
                fail: reject
            });
        }
        #endif
    });
}

2. 调用统一接口

在需要登录的地方调用这个统一接口,并根据返回的令牌类型进行后续处理。

// 使用示例
googleLogin().then(({ tokenType, token }) => {
    console.log(`Token Type: ${tokenType}, Token: ${token}`);
    // 根据tokenType进行后续处理,比如保存到本地或发送到服务器
}).catch(error => {
    console.error('Google Login Failed:', error);
});

3. 优化建议

  • 令牌转换:如果后端服务要求统一的令牌类型,考虑在客户端或服务端实现令牌转换逻辑。
  • 原生插件更新:检查是否有更新的原生插件版本,可能已经解决了令牌类型不一致的问题。
  • 文档与注释:在代码中添加详细的注释,说明为何需要进行这样的处理,以便于后续维护。

通过上述方式,您可以在uni-app中实现谷歌登录在iOS和Android平台上的统一处理,确保两端返回的数据格式一致,便于后续的业务逻辑处理。

回到顶部