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、其他参考的帖子和实现方法

相关推荐
迅猛龙办公室4 分钟前
python实现简单进度条
java·前端·python
Rosanci14 分钟前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex
zhangzeyuaaa19 分钟前
深入 Ruby:Block、Proc、Lambda 核心区别与最佳实践
开发语言·前端·ruby
liangshanbo12151 小时前
前端高级面试题:WebSocket 双向流式通信怎么设计?
前端·websocket·网络协议
可乐鸡翅yeah_1 小时前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
zwd20051 小时前
Manim arrange 和 arrange_in_grid 用法详解:buff、aligned_edge、rows/cols(0.21.0 实测)
前端·python·edge
小小龙学IT1 小时前
Go 语言 reflect 反射包深度解析:从 Type/Value 到三大定律与工业实践
前端·golang
小溪学编程1 小时前
C语言篇:枚举类型
java·c语言·前端
xingpanvip1 小时前
星盘接口开发文档:推算星座接口指南
前端·php
Da Da 泓1 小时前
HTML浅浅入门
前端·html