uniapp 如何实现google登录-安卓端

uniapp 如何实现google登录-安卓端

本文只讲解uniapp安卓端如何获取到idToken,ios使用uniapp官方方法可以获取

海外app貌似最常用的就是邮箱登录,在app上表现出来最常用的就是谷歌一键登录,或者邮箱加网页验证;google登录流程大致如下

  • 点击google登录->选择账号->获取到idToken等信息->给到后端->校验并创建自己的token

1、官方给的uni.login登录获取不到idToken、serverAuthCode

主要是安卓获取不到,ios可以获取到,不过ios我没有测试

javascript 复制代码
const info = ref()
uni.login({
  provider: 'google' as any,
  success(loginRes) {
    console.log('登录成功', loginRes)
    info.value.loginRes = loginRes
    uni.getUserInfo({
      provider: 'google' as any,
      success(info1) {
        info.value.userInfo = info1
        console.log('获取用户信息成功', info1)
      },
      fail(err) {
        console.log('获取用户信息失败', err)
        info.value.err2 = err
      },
    })
  },
  fail(err) {
    console.log('登录授权失败', err)
    info.value.err = err
  },
})

最终可以拿到信息只有以下内容(这个是自身的基座运行拿到的数据)

json 复制代码
{
    "loginRes": {
        "authResult": {
            "openid": "xxx",
            "unionid": "xxx"
        },
        "errMsg": "login:ok"
    },
    "userInfo": {
        "userInfo": {
            "headimgurl": "https://lh3.googleusercontent.com/a/ACg8ocJErWXFYxbMX6kU6VxErv2PSreD-Lj-Pu8wfOACqXqLBUA9UGo",
            "nickname": "m ds",
            "unionid": "xxx",
            "openid": "xxx",
            "email": "2222122121@gmail.com",
            "openId": "xxx",
            "nickName": "m ds",
            "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocJErWXFYxbMX6kU6VxErv2PSreD-Lj-Pu8wfOACqXqLBUA9UGo"
        },
        "errMsg": "getUserInfo:ok"
    }
}

里面并没有需要的idToken,无法提供给后端完整鉴权校验

2、我的实现方式

我查到的谷歌登录获取到idToken的方式有两种

  • 使用Google Sign-In SDK
  • Credential Manager (我选择的实现方式,不过还是使用别人的插件)

插件地址:ext.dcloud.net.cn/plugin?id=2...

这个插件是在官方插件上改版的,官方插件有一些问题,这个做了部分修改,并增加了部分功能

不过我在使用过程中还是存在一些问题

  • 1、插件获取到登录数据了,但是解析失败,这个主要是没有对谷歌返回的数据进行分类处理

修改插件代码修复解析失败问题:

kt 复制代码
// 将以下handleSignIn方法替换原有的handleSignIn方法即可
// 原有的代码仅处理了GoogleIdTokenCredential一种情况,没有处理CustomCredential

fun handleSignIn(result: GetCredentialResponse): GoogleLoginSuccess? {
		val credential = result.credential
		if (credential is com.google.android.libraries.identity.googleid.GoogleIdTokenCredential) {
			val idToken = credential.idToken
			// 验证 Token 并获取用户信息
			return getUserFromToken(idToken)
		} else if (credential is androidx.credentials.CustomCredential) {
            if (credential.type == com.google.android.libraries.identity.googleid.GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
                try {
                    val googleIdTokenCredential = com.google.android.libraries.identity.googleid.GoogleIdTokenCredential.createFrom(credential.data)
                    return getUserFromToken(googleIdTokenCredential.idToken)
                } catch (e: Exception) {
                    // console.log("Failed to parse GoogleIdTokenCredential", e)
                    return null
                }
            }
        }
		// 处理其他类型的凭证(如密码)
		return null
	}

插件使用方式

ts 复制代码
// #ifdef APP
import { googleLogin, googleLogout } from '@/uni_modules/coc-oauth-google'
// #endif

function googleLogin_() {
  googleLogin({
    serverClientId: 'xxxxx.apps.googleusercontent.com', // 必填web端id
    success: (res: any) => {
      console.log('success------111--------', res)

      copy(JSON.stringify(res))
    },
    fail: (res: any) => {
      console.log('fail-------222-------', res)
    },
    complete: (res: any) => {
      console.log('complete====333=======', res)
    },
  })
}

拿到的数据如下,包含需要使用的idToken

json 复制代码
{
    "email": "xxxxx@gmail.com",
    "nickname": "xxxx",
    "idToken": "xxxxxxx.xxxxxxxx.xxxxxxxx",
    "headimgurl": "https://lh3.googleusercontent.com/a/ACg8ocJErWXFYxbMX6kU6VxErv2PSreD-Lj-Pu8wfOACqXqLBUA9UGo=s96-c",
    "openId": "xxxxxxxxxxxxxxxxxxx"
}

3、google登录注意点

  • ClientId必须使用web端ClientId,不能使用android端ClientId,原因不明,只知道必须这样子
  • 打包发布到google的应用市场需要修改android凭证的sha-1值

4、其他参考的帖子和实现方法

相关推荐
IT_陈寒1 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
To_OC1 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
DigitalOcean2 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年2 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟3 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu113 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue3 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区3 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两3 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒3 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript