更新记录
1.0.0(2026-11-05)
- 新增 Android Credential Manager 与 iOS GoogleSignIn 官方原生身份登录实现,支持 ID Token 与 nonce;实际平台验收边界见 README。
- 新增本地环境检查,按凭据组件所需最低 Google Play 服务版本检测 Android 可用性。
- 新增本地退出、按请求编号取消登录等待、可配置超时、并发保护与单次回调。
- 新增原生与 UTS 脱敏诊断、完整报告一键复制、固定快照分段及复制失败手动回退。
- 新增 uni-app Vue2/Vue3 与 uni-app x 分类示例,按登录、会话、测试和配置 tabs 展示全部公开能力,保留公共状态与完整日志。
- 新增真实接口空 ID、无效时限和无请求取消测试入口,以及开发者 OAuth 配置、后端验签与多端验收说明。
平台兼容性
uni-app(5.33)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | - | - | - | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | - | × | × |
uni-app x(5.33)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | - | - | × | × |
Google 授权登录 UTS 插件
介绍
lizhao-google-login 面向 uni-app、uni-app x,封装 Google 官方原生身份登录,在 Android、iOS 取得 ID Token,由业务后端验签后建立自己的账号会话。提供登录、本地退出、取消超时、环境检查和脱敏诊断。当前作为开发者接入与自测源码交付;真实 OAuth 登录、后端验签及 iOS Apple 编译/真机回跳仍需在自己的应用中验收,不能把本地编译或参数测试视为登录成功。
功能特色
| 功能 | 对应 API / 配置 | 用途 |
|---|---|---|
| Google 身份登录 | signInGoogle |
Android 使用 Credential Manager,iOS 使用 GoogleSignIn,成功返回非空 ID Token 和可取得的资料 |
| 本地环境检查 | checkGoogleLoginEnvironment |
检查前台上下文、Google Play 服务版本、配置、iOS 回跳与原生忙碌状态 |
| 一次性挑战 | nonce |
原样传给 SDK,供后端绑定登录请求、核对并防止重放 |
| 本地退出 | signOutGoogle |
清除本应用 Google 登录或凭据选择状态;业务会话需另外退出 |
| 取消与超时 | cancelGoogleLogin、timeoutMs |
按请求编号取消本地登录等待,隔离重复与迟到回执 |
| 诊断读取与清理 | getGoogleLoginDiagnosticsSync、clearGoogleLoginDiagnosticsSync |
汇总脱敏的 UTS / 原生日志,清理诊断不会改变账号状态 |
| 分类示例 | 登录 / 会话 / 测试 / 配置 tabs | 覆盖全部公开 API,保留状态、环境和底部完整报告;两种宿主功能一致 |
| 完整报告 | 示例报告辅助模块 | 一键复制、固定快照分段、失败手动回退,记录环境来源与日志丢弃情况 |
适合哪些场景
| 场景 | 推荐能力 | 使用边界 |
|---|---|---|
| 应用提供 Google 账号登录 | signInGoogle → 自己的后端验签 |
Android 需要可用 GMS;设备网络与账号可访问 Google |
| 现有业务账号绑定 Google | 后端关联验签后的 sub |
不以邮箱、昵称或客户端成功标记作为可信身份 |
| 登录请求防重放 | 后端下发一次性 nonce |
后端绑定请求、校验并单次消费,插件不生成固定挑战 |
| 页面关闭、授权中断 | 保存请求编号并取消登录等待 | iOS 系统授权 UI 可能仍需用户关闭;不撤销已授予权限 |
| 配置或基座问题排查 | 环境检查、复现一次后复制日志 | 本地检查无法证明后台登记、真实网络和后端 audience 正确 |
本插件只处理身份认证,不提供 accessToken、refreshToken、serverAuthCode、额外 scopes、Google 撤权或业务后端登录接口。访问 Drive、Calendar 等 API 需另行实现对应授权;无需为了使用本插件额外接入 Firebase 或 uniCloud。
下载与导入
| 宿主 | 示例代码位置 |
|---|---|
| uni-app | uni_modules/lizhao-google-login/example/uniapp/index.vue |
| uni-app x | uni_modules/lizhao-google-login/example/uniappx/index.uvue |
从基础到进阶:按业务模块使用
基础功能配置示例
接入前准备
| 步骤 | 必须准备的内容 | 检查方式 |
|---|---|---|
| 1. 导入 | 完整保留 uni_modules/lizhao-google-login/ |
页面从插件根目录导入,避免直接引用 utssdk 实现 |
| 2. Web 客户端 | 自己 Google Cloud 项目的 Web 类型 OAuth Client ID | 两端传给 serverClientId;不能用 Android 类型 ID 替代 |
| 3. Android 登记 | 同项目的 Android OAuth 客户端,登记实际包名和签名 SHA-1 | 调试、正式、Play App Signing 的签名分别核实 |
| 4. iOS 登记 | 实际 Bundle ID 对应的 iOS OAuth 客户端、Client ID 和反转 URL Scheme | 与 Web 类型分开;配置合入最终安装包 |
| 5. 原生构建 | 使用包含该插件的原生联编或自定义基座 | 标准基座不含插件,WGT 不能增加或替换原生 SDK |
| 6. 账号与后端 | 按项目的 OAuth 发布/测试状态配置账号访问;业务后端完成 ID Token 验签 | 本地环境满足后仍需真实账号测试 |
Google Cloud 后台由项目管理者操作;若 Google 要求账号安全验证,需该账号本人完成。Client ID 是公开应用标识,Client Secret 是服务端秘密,插件不接收 Secret,不应将密码、证书私钥或 Token 写入前端配置。
插件按每次调用配置,无需额外的初始化 API。下面的 UTS 函数可放在 uni-app x 页面脚本中,由登录按钮传入页面中填写的真实 Web Client ID;省略 nonce、iosClientId 和 timeoutMs 时分别采用未设置、读取 iOS Bundle 配置、120000 毫秒。iOS 仍须完成下文的 Bundle 配置。
import { signInGoogle, GoogleSignInOptions } from '@/uni_modules/lizhao-google-login'
function requestGoogleLogin(webClientId: string): string {
const options: GoogleSignInOptions = {
serverClientId: webClientId,
success: (result) => {
// result.idToken 通过 HTTPS 交给自己的业务后端;不打印、保存或复制令牌。
console.log('已取得 Google 凭据,等待后端验签;请求=' + result.requestId)
},
fail: (error) => { console.log('Google 登录失败:' + error.errCode.toString() + ';' + error.errMsg) },
complete: (result) => { console.log('完成回调:' + result.errCode.toString()) }
}
return signInGoogle(options)
}
注册示例页面
在各自宿主的 pages.json 的 pages 数组中加入对应对象,保留其他页面。uni-app x 使用:
{
"path": "uni_modules/lizhao-google-login/example/uniappx/index",
"style": { "navigationBarTitleText": "Google授权登录" }
}
uni-app 的 Vue2 / Vue3 使用:
{
"path": "uni_modules/lizhao-google-login/example/uniapp/index",
"style": { "navigationBarTitleText": "Google授权登录" }
}
iOS 配置代码
将下面片段合并到 uni_modules/lizhao-google-login/utssdk/app-ios/Info.plist 已有的 <dict> 中,替换所有 YOUR_... 为自己项目的真实值。保留宿主原有的其他 URL Scheme;示例字符串不能直接用于登录。Android 不需要这些字段。
<key>GIDClientID</key>
<string>YOUR_IOS_CLIENT_ID.apps.googleusercontent.com</string>
<key>GIDServerClientID</key>
<string>YOUR_WEB_CLIENT_ID.apps.googleusercontent.com</string>
<key>CFBundleURLTypes</key>
<array><dict><key>CFBundleURLSchemes</key><array>
<string>com.googleusercontent.apps.YOUR_IOS_CLIENT_ID</string>
</array></dict></array>
反转 Scheme 使用 Google 控制台提供的 iOS URL Scheme;不要反转 Web ID。调用时传入的 iosClientId 与 Bundle 中 GIDClientID 同时存在时须一致;serverClientId 与 GIDServerClientID 同时存在时也须一致。配置变更后重新构建 iOS 原生包。参考 Google iOS 配置指南。
高级示例
组合配置与精确取消
以下 UTS 示例适用于 uni-app x。webClientId 来自自己的 Web 客户端,iosClientId 在 Android 传空字符串、在 iOS 可传真实 ID 或留空读取 Bundle,challenge 来自自己的后端。页面调用 loginWithChallenge;关闭页面或点击取消时调用 cancelOwnLogin。业务先限制一次原生操作,插件也会拒绝冲突请求。
import { signInGoogle, cancelGoogleLogin, GoogleSignInOptions } from '@/uni_modules/lizhao-google-login'
let loginRequestId = ''
function loginWithChallenge(webClientId: string, iosClientId: string, challenge: string) {
if (loginRequestId.length > 0) return
const options: GoogleSignInOptions = {
serverClientId: webClientId,
iosClientId: iosClientId,
nonce: challenge,
timeoutMs: 30000,
success: (result) => { console.log('已取得凭据,请交后端核对挑战;请求=' + result.requestId) },
fail: (error) => { console.log('授权结果:' + error.errCode.toString() + ';' + error.errMsg) },
complete: (result) => { if (loginRequestId == result.requestId) loginRequestId = '' }
}
loginRequestId = signInGoogle(options)
}
function cancelOwnLogin() {
if (loginRequestId.length == 0) return
const result = cancelGoogleLogin(loginRequestId)
console.log('本地等待已取消=' + result.cancelled.toString() + ';系统界面可能保留=' + result.nativeUiMayRemain.toString())
}
| 配置或操作 | 示例行为 | 必须保留的处理 |
|---|---|---|
nonce: challenge |
将后端的一次性挑战原样交 SDK | 不用固定值;后端验证归属和单次消费;最长 512 字符且无空白/控制字符 |
timeoutMs: 30000 |
最多等待 30 秒 | 超时返回 9365010;外部授权结果未知,不能显示成功或直接重复弹窗 |
iosClientId |
显式传入或留空读取 Bundle | 显式值仍须与 Bundle 一致;Android 留空 |
cancelGoogleLogin(loginRequestId) |
只结束对应登录的本地等待 | 不取消退出操作;不存在的请求返回 cancelled=false |
| 页面卸载 | 调用 cancelOwnLogin 或直接按活动请求号取消 |
忽略旧页面回执;iOS 系统授权界面可能仍需用户关闭 |
环境检查、退出与诊断
以下 UTS 函数可直接放入页面脚本。环境检查不用登录账号,也不代表后台登记验证通过。inspectGoogle 传入实际配置或空字符串查看缺失项;logoutGoogle 由“本地退出”按钮调用;诊断函数由各自按钮触发,不自动上传。
import { checkGoogleLoginEnvironment, signOutGoogle, getGoogleLoginDiagnosticsSync, clearGoogleLoginDiagnosticsSync } from '@/uni_modules/lizhao-google-login'
function inspectGoogle(webClientId: string, iosClientId: string) {
checkGoogleLoginEnvironment({
serverClientId: webClientId,
iosClientId: iosClientId,
success: (result) => { console.log('本地可用=' + result.available.toString() + ';' + result.checks.join(';')) },
fail: (error) => { console.log('环境检查失败:' + error.errCode.toString()) },
complete: (result) => { console.log('环境检查完成:' + result.errCode.toString()) }
})
}
function logoutGoogle() {
signOutGoogle({
timeoutMs: 30000,
success: (result) => { console.log('本地退出完成;业务后端会话请另行退出') },
fail: (error) => { console.log('退出失败:' + error.errCode.toString() + ';' + error.errMsg) },
complete: (result) => { console.log('退出完成回调:' + result.errCode.toString()) }
})
}
function readGoogleDiagnostics() {
const result = getGoogleLoginDiagnosticsSync()
console.log('插件=' + result.pluginId + ';公共日志=' + result.logs.length.toString() + ';丢弃=' + result.droppedLogs.toString())
}
function clearGoogleDiagnostics() {
clearGoogleLoginDiagnosticsSync()
console.log('插件诊断已清理,账号状态不变')
}
后端通过可信库验证 Google ID Token 的签名、iss、aud、exp,再用验签后的 sub 关联用户;设置 nonce 时还要验证挑战。客户端解码 JWT 或拿到一个非空字符串都不等于建立可信业务会话。参考 Google 后端验签指南。
完整示例
页面分类与功能入口
交付示例统一使用紧凑业务 tabs。默认显示“登录”,选中态清晰;切换只改变展示,保留配置、请求、忙碌状态和已有日志,不重新调用 SDK。状态与诊断放公共区域,错误不会因切换分类而消失。示例的“测试”页同时给出填写配置、检查环境、登录或取消、本地退出的操作顺序;六个公开 API 均可从分类或公共区域触发。
| 分类 / 公共区域 | 能力 / API | 测试方法 |
|---|---|---|
| 登录 | serverClientId、signInGoogle |
输入自己项目的 Web ID,点击 Google 登录;成功仅显示 Token 存在与长度 |
| 会话 | signOutGoogle |
点击“退出本地会话”,核对 success / fail / complete;不移除手机账号 |
| 测试 | signInGoogle 空配置 |
点击“空 ID”,Android / iOS 应返回 9365003,不能发起原生授权 |
| 测试 | signOutGoogle 无效时限 |
点击“无效时限”,传 1ms,应返回 9365001,不能实际清除登录状态 |
| 测试 | cancelGoogleLogin('') |
空闲时点击“无请求取消”,应显示 cancelled=false |
| 配置 | iosClientId、nonce、timeoutMs |
输入配置后切回登录;nonce 原样传递,时限也应用于本地退出 |
| 公共状态 | cancelGoogleLogin(requestId) |
登录等待时点击取消;退出请求期间该按钮禁用 |
| 公共环境 | checkGoogleLoginEnvironment |
OAuth 未填也可检查;配置完成后重查本地条件,观察 GMS / 回跳 / 忙碌状态 |
| 公共诊断 | getGoogleLoginDiagnosticsSync、clearGoogleLoginDiagnosticsSync |
读取快照、清理插件日志;页面历史和既有报告仍保留 |
| 底部日志 | 一键复制 / 完整报告 / 复制下一段 / 更新快照 | 检查环境来源、完整日志与首尾标记;分段共享同一报告号,复制失败不推进 |
完整分类页面路径:uni-app x 为 uni_modules/lizhao-google-login/example/uniappx/index.uvue;uni-app 为 uni_modules/lizhao-google-login/example/uniapp/index.vue。页面模板主源是 uni_modules/lizhao-google-login/example/page.template;保留脚本、回调与完整报告合同,两宿主仅语法和滚动适配不同。
下面分别给出两种宿主可复制的完整最小页面,串联输入、忙碌保护、成功/失败/完成和卸载取消。它们不包含示例页面的全部样式与报告实现;需要全部功能时直接注册上述真实分类页面。
uni-app x 完整最小页面
页面输入实际 Web Client ID;iOS Client ID 从已配置 Bundle 读取。
<template>
<view style="padding:12px">
<input v-model="clientId" placeholder="Web Client ID" />
<button :disabled="busy" @click="login">使用 Google 账号登录</button>
<text>{{ status }}</text>
</view>
</template>
<script setup lang="uts">
import { ref } from 'vue'
import { signInGoogle, cancelGoogleLogin, GoogleSignInOptions } from '@/uni_modules/lizhao-google-login'
const clientId = ref('')
const status = ref('尚未登录')
const busy = ref(false)
let requestId = ''
function login() {
if (busy.value) return
busy.value = true
const options: GoogleSignInOptions = {
serverClientId: clientId.value,
timeoutMs: 120000,
success: (result) => {
// 将result.idToken通过HTTPS交业务后端验签;这里仅显示存在性,不打印或保存令牌。
status.value = '已取得身份凭据,等待后端验签'
},
fail: (error) => { status.value = error.errCode.toString() + ':' + error.errMsg },
complete: (result) => {
if (requestId != result.requestId) return
requestId = ''
busy.value = false
}
}
requestId = signInGoogle(options)
}
onUnload(() => { if (requestId.length > 0) cancelGoogleLogin(requestId) })
</script>
uni-app Vue2 / Vue3 完整最小页面
通用 Options API,带环境检查、登录、本地退出与卸载取消。
<template>
<view>
<input v-model="clientId" placeholder="Web Client ID" />
<button @click="inspect">检查环境</button>
<button :disabled="busy" @click="login">使用 Google 账号登录</button>
<button :disabled="busy" @click="logout">本地退出</button>
<text>{{ status }}</text>
</view>
</template>
<script>
import { checkGoogleLoginEnvironment, signInGoogle, signOutGoogle, cancelGoogleLogin } from '@/uni_modules/lizhao-google-login'
export default {
data() { return { clientId: '', status: '尚未登录', requestId: '', busy: false } },
onUnload() { if (this.requestId) cancelGoogleLogin(this.requestId) },
methods: {
inspect() {
checkGoogleLoginEnvironment({ serverClientId: this.clientId,
success: result => { this.status = result.available ? '本地条件满足' : result.checks.join(';') },
fail: error => { this.status = error.errCode + ':' + error.errMsg }
})
},
login() {
if (this.busy) return
this.busy = true
this.requestId = signInGoogle({ serverClientId: this.clientId,
success: result => { this.status = '已取得ID Token,等待业务后端验签' },
fail: error => { this.status = error.errCode + ':' + error.errMsg },
complete: result => {
if (this.requestId !== result.requestId) return
this.requestId = ''
this.busy = false
}
})
},
logout() {
if (this.busy) return
this.busy = true
this.requestId = signOutGoogle({ success: result => { this.status = '本地退出完成,业务会话需后端另行退出' },
fail: error => { this.status = error.errCode + ':' + error.errMsg },
complete: result => {
if (this.requestId !== result.requestId) return
this.requestId = ''
this.busy = false
}
})
}
}
}
</script>
开发者验收清单
| 场景 | 操作与期望 | 所需条件 |
|---|---|---|
| 未配置 | 测试页空 ID 返回 9365003;环境给出缺失项 | 匹配原生包;无需真实 Client ID |
| 无效时限 | 测试页返回 9365001;日志记录一次 fail / complete | 匹配原生包;无需真实 Client ID |
| GMS 不满足 | 检查不可用;Android 登录应返回 9365006 | 可复现的服务缺失、禁用或版本过低设备;不要求为测试修改主力机 |
| 正常登录 | 官方授权完成,success 带非空 ID Token,complete 一次 | 自己的 Web ID、实际包名/签名或 Bundle 配置、可访问 Google 的网络与账号 |
| 后端验证 | 验签、audience、有效期、挑战通过后建立业务会话 | 自己的后端与一次性挑战;该步骤由接入者实现 |
| 取消 / 超时 | 系统取消 9365008;本地主动取消 9365009;超时 9365010;迟到结果不再触发成功 | 真实授权;可将配置时限设为 10000ms 并保持授权等待 |
| 切换 / 重复点击 | 分类切换保留输入及请求;忙碌时不发第二次登录;卸载后不更新旧页面 | 授权等待期间测试 |
| 本地退出 | success / fail 如实反馈;设备 Google 账号与后端会话不被擅自删除 | 可用原生 SDK;不需要 Client ID |
| 报告与剪贴板 | 复制后实际粘贴,核对报告号、首尾标记、条数、长度、环境来源、脱敏及各分段可重组 | 目标宿主真实剪贴板;模拟/静态检查不能替代 |
| 复制失败 / 长报告 | 失败展示真实错误和手动文本;分段只在成功后前进;更新快照才重置分段 | 在测试宿主构造剪贴板失败或大量操作日志 |
| iOS 回跳 | 正确 Scheme 能回到应用;缺失/冲突明确报错;取消后重试无旧结果污染 | Apple 编译、签名安装包和真实 iOS 设备 |
| 不支持端 | Web / Harmony / 小程序保留本身的其他登录方式;参数合法后本插件业务失败 9365002 | 对应宿主构建与实际运行;不能把页面可显示算作 Google 登录支持 |
两端示例底部可复制的报告包含运行环境、插件和原生构建来源、脱敏结果/异常及本页保留的完整日志,页面只显示最近摘要。uni_modules/lizhao-google-login/example/report.uts 为报告主源,uni_modules/lizhao-google-login/static/report.js 是同源生成的传统宿主模块。页面报告缓存上限 1000 条 / 1MiB UTF-8,截断会记录丢弃数量与范围。未知 HX 编译版本、基座身份等明确标记 unknown;不以排查电脑的版本代替安装包构建来源。分段使用同一固定快照,复制失败保留原段并提供手动复制,复制不清空日志。
API 用途速查
| API | 返回 | 用途 |
|---|---|---|
checkGoogleLoginEnvironment(options) |
string请求编号 | 异步报告本地前置条件,available不保证外部服务可用 |
signInGoogle(options) |
string请求编号 | 取得ID Token,支持nonce、超时和单次success/fail/complete |
signOutGoogle(options) |
string请求编号 | 清除本应用Google本地状态,不能代替服务端退出或Google撤权 |
cancelGoogleLogin(requestId) |
GoogleLoginCancelResult | 精确取消本地登录等待;不取消其他请求或正在执行的退出 |
getGoogleLoginDiagnosticsSync() |
GoogleLoginDiagnostics | 读取脱敏公共/原生快照,不含业务凭据 |
clearGoogleLoginDiagnosticsSync() |
void | 清理插件诊断;不改授权/账号状态,也不清除页面既有报告 |
登录、环境与退出参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| serverClientId | string | 登录必填,环境检查选填 | Web类型OAuth ID;两端语义一致 | 无 | 自己的Web Client ID |
| iosClientId | string/null | 否 | iOS类型;必须匹配Bundle配置;Android不使用 | 读取GIDClientID | 自己的iOS Client ID |
| nonce | string/null | 否 | 后端挑战,最长512字符,不含空白/控制符;只用于登录 | 不传 | 后端生成的一次性值 |
| timeoutMs | number/null | 否 | 登录/退出时限,单位毫秒,10000–300000整数 | 120000 | 范围内整数 |
| success | function | 否 | 登录成功包含凭据;环境检查包含检查结果;退出为无凭据摘要 | 无 | 业务回调 |
| fail | function | 否 | GoogleLoginFail,包含统一错误和脱敏原生原因 | 无 | 业务回调 |
| complete | function | 否 | 无论成功失败均至多一次,只含摘要 | 无 | 业务回调 |
| requestId | string | 取消必填 | 由该次登录返回的编号,不能复用别的请求编号 | 无 | 对应活动请求 |
checkGoogleLoginEnvironment只接收clientId相关字段及回调;signOutGoogle只接收timeoutMs及回调。callback缺省时仍执行真实操作和诊断;建议至少提供fail与complete。所有业务回调异步派发,返回请求编号后才交付;同一次success与fail互斥,complete最多一次。回调抛错被隔离并记录,不阻止complete。
登录结果与资料
GoogleLoginSuccess必含errSubject、errCode=0、errMsg、requestId、platform、非空idToken。userId、email、displayName、givenName、familyName、avatarUrl可为null。Android选定Google ID SDK的id只有邮箱语义,所以userId=null;不要把邮箱当稳定sub。iOS资料来自SDK,也须以服务器验签结果为准。示例不保存令牌、不输出前后缀、不自动复制凭据。
GoogleLoginComplete只含errSubject/errCode/errMsg/requestId/platform。GoogleLoginFail额外包含nativeCode/nativeType/nativeCause/nativeStack,未知字段写unknown;详细原文先脱敏。GoogleLoginEnvironment含nativeSupported/available/hasActivity/nativeBusy/googlePlayServicesStatus/serverClientIdConfigured/iosClientIdConfigured/urlSchemeConfigured/sdkVersion/nativeBuildId/packageName/checks/limitations;Android不适用的iOS字段为false,iOS的GMS状态为-1,具体边界写入limitations。Android按当前凭据组件所需的最低Google Play服务版本检查:状态2表示需要更新服务,状态0仅表示本地服务版本检查通过,不代表网络、OAuth配置或真实授权已验证。
GoogleLoginDiagnostics含插件ID、版本及来源构建标记、生成时间、运行端、公共日志、丢弃条数、诊断失败计数和脱敏原生快照。构建标记只是对应源码的身份,不能单独证明实际安装了匹配原生包。
取消返回值
| 字段 | 类型 | 含义 |
|---|---|---|
| errSubject / errCode / errMsg | string / number / string | 统一错误主题与取消操作摘要;没有活动请求时也可返回 errCode=0 |
| requestId | string | 本次尝试取消的请求编号 |
| cancelled | boolean | 是否确实结束了匹配登录请求的本地等待;没有匹配请求时为 false |
| nativeCancellationRequested | boolean | 原生层是否确认收到取消请求,不代表撤回 Google 授权 |
| nativeUiMayRemain | boolean | 系统授权界面可能仍保留,关闭后检查环境再重试 |
错误码说明
errSubject统一为lizhao-google-login。取消、超时均不会撤销已在Google端发生的操作;超时的外部结果保持未知。缺token、坏回执、配置失败均不作为登录成功。
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 9365001 | 参数无效 | 核对nonce、类型、时限范围和整数约束 |
| 9365002 | 当前平台不支持 | 只在Android/iOS调用,其他端保留自己的登录方式 |
| 9365003 | OAuth配置无效 | 区分Web与iOS客户端ID,检查冲突/占位值及后台登记 |
| 9365004 | iOS回跳Scheme缺失 | 合并Info.plist、核对实际Bundle并重新原生联编 |
| 9365005 | 原生操作仍在进行 | 等待系统授权UI结束,检查环境后重试 |
| 9365006 | Google Play服务不可用 | 检查GMS安装/版本/禁用状态;不靠旧SDK绕过无GMS |
| 9365007 | 无可用Google凭据 | 检查账号、设备、网络及OAuth签名配置 |
| 9365008 | 用户取消系统授权 | 按正常用户取消处理,不自动弹第二次窗口 |
| 9365009 | 本地主动取消 | 等待/关闭系统UI后按需要重试,未撤销外部授权 |
| 9365010 | 等待超时 | 外部结果未知,检查原生忙碌状态和网络再重试 |
| 9365011 | 无可用前台页面 | 页面可交互且Activity/ViewController有效时调用 |
| 9365012 | 原生SDK失败 | 提供脱敏完整报告,保留底层错误分类与阶段 |
| 9365013 | 缺少有效ID Token | 检查Web客户端ID和OAuth配置,不使用空token |
| 9365014 | 桥接或回执无效 | 核对源码、原生基座与运行资源是否匹配 |
| 9365015 | 凭据类型或解析异常 | 检查完整依赖及SDK版本,不强制当Google凭据成功 |
| 9365016 | 本地退出失败 | 保留原会话边界,记录错误后重试;不要显示伪退出 |
| 9365017 | 取消或释放未确认 | 本地等待可能已结束,原生状态未知,检查环境/报告 |
注意事项
宿主、平台与验证范围
| 宿主 / 运行端 | 实现与最低要求 | 当前验证边界 |
|---|---|---|
| uni-app Vue2 / Vue3(vue 页面) | 共用 Options API 示例与插件根入口 | 已有 Android 资源与对应生成 Kotlin 联编证据;真实 Google 账号完整宿主流程待开发者验收 |
| uni-app nvue | 未交付 nvue 专用示例 | 未验证,兼容性待确认 |
| uni-app x Vapor | Composition API / script setup 示例;本项目使用 Vapor | 本地资源/生成物验证与 Google 登录业务验收分别记录;实际宿主仍需匹配原生包 |
| uni-app x 非 Vapor | 本轮未对该渲染模式单独验收 | 不把 Vapor 结果当作非 Vapor 通过 |
| Android | Android 6.0 / API 23 起;需要 Google Play 服务 | K30 原生测试壳已检查环境、错误路径和本地退出;不替代最新两宿主或真实登录 / Token 验签 |
| iOS | iOS 13 起,GoogleSignIn 9.2.0 | 有原生实现与资源生成证据;Apple SwiftCompile / 链接、签名安装及真实账号回跳待验收 |
| Harmony / 鸿蒙元服务 | 未实现 Google 原生 SDK 登录 | 不支持;能加载公共入口时返回明确不支持,不用其他账号冒充 |
| Web(含 Chrome / Safari) | 未提供 Google Identity Services 网页实现 | 仅用于示例 UI 和不支持错误验证,不支持 Google 登录 |
| 小程序(微信、支付宝及其他) | 未实现 Google 登录 | 不支持;不以内嵌网页、空对象或模拟回执代替 |
| 快应用 | 未实现 | 不支持 |
| 云端(uniCloud 等) | 本包不提供后端云函数 | 可接自己的后端,但须自行完成验签和业务会话 |
开发与既有本地验证使用 HBuilderX 5.33.2026102401,最低引擎声明见 uni_modules/lizhao-google-login/package.json,不推定更早版本兼容。市场兼容性使用 √(支持)、-(待确认)和 x(不支持):
| 市场字段 | 当前标记 | 判断依据与边界 |
|---|---|---|
| uni-app Vue2、Vue3、App vue 页面 | √ |
两种宿主页面与插件调用已生成并联编;此标记仅表示框架和页面适配,不代表 Google 真实授权已验收 |
| uni-app nvue | - |
没有专用示例及运行证据 |
| uni-app、uni-app x 的 Android 和 iOS | - |
两端已有原生实现;Android 真实授权、iOS Apple 编译和回跳仍须在匹配的宿主包中验证 |
| uni-app x Vapor | - |
有 Vapor 资源与页面证据,完整原生宿主和真实登录仍待验 |
| Harmony、Web、各小程序、快应用及云端 | x |
本插件不提供这些端的 Google 登录或后端实现 |
市场如果要求 uni-app x 至少一个运行平台标为支持,需先完成该平台的真实登录验证,再按结果调整;不要仅为通过提交校验把待确认标成支持。Android / iOS 的目录存在或资源编译通过也不代表真实登录已验收。
固定依赖与环境
| 平台 | 固定依赖 / 配置 | 接入注意 |
|---|---|---|
| Android | Credential Manager / provider 1.3.0、googleid 1.1.1、play-services-base 18.3.0;配置在 uni_modules/lizhao-google-login/utssdk/app-android/config.json |
最低 GMS versionCode 按当前 provider 所需的 230815045 检查;状态 2 需更新,状态 0 仅表示本地版本满足 |
| iOS | GoogleSignIn 9.2.0 及已固定传递依赖;配置在 uni_modules/lizhao-google-login/utssdk/app-ios/config.json |
CocoaPods 取依赖;合入 uni_modules/lizhao-google-login/utssdk/app-ios/Info.plist 与 uni_modules/lizhao-google-login/utssdk/app-ios/PrivacyInfo.xcprivacy |
| 权限 | Android 仅 INTERNET;iOS 使用真实 OAuth 回跳 Scheme | 不为登录申请电话、通讯录、定位或存储权限 |
| 网络与账号 | 使用 Google 官方服务 | 系统存在账号或普通网页可打开,不等于 Google 授权链路已通过 |
SDK 不需手动拷入工程,依赖许可与来源见 uni_modules/lizhao-google-login/THIRD-PARTY-NOTICES.md。Android 采用 Credential Manager 的 Google 身份能力,接入前置条件参考 Google Android 身份登录文档。
原生基座、生命周期与隐私
| 变更 / 操作 | 要求 |
|---|---|
| 首次导入、SDK、UTS / Kotlin / Swift、原生权限 / Manifest / Info.plist / 隐私配置变更 | 重新原生联编或制作匹配自定义基座;WGT 无法替换旧原生代码 |
| 仅页面、样式、说明变化 | 通常可更新页面资源;仍须确认实际安装包含当前原生实现 |
| 生成插件版本与 build-info 变化 | 构建标记进入原生 UTS,应重新联编以保证报告身份与源码一致 |
| 一次原生操作进行中 | 等待完成或按登录请求号取消;正常系统授权覆盖页面不直接当作取消 |
| iOS 逻辑取消 / 超时 | 原生 UI 可能仍保留,等待 SDK 真实结束;检查环境后再尝试新请求 |
| 本地退出 | 不移除设备账号、不撤销 Google 权限、不清除业务后端会话 |
| 日志与 Token | 报告在内存中保留,不默认上传;示例不保存、显示或复制 Token、nonce 和个人资料 |
日志失败不会改变业务 success / fail / complete 语义;诊断报告保留可取得的错误类型、原因与堆栈并先脱敏。不要在自己的业务日志中明文打印 ID Token、邮箱、完整回跳 URL 或 nonce。登录按钮使用官方来源图标,遵循 Google 品牌规范;Google 及相关标识属于其权利人,本插件不表示获得 Google 认可。
本地语法、资源导出、原生生成物、独立测试壳、匹配宿主基座与真实账号业务是不同验证层级。未完成真实 OAuth、后端验签、Apple 编译或设备剪贴板检查时,应按上面的清单由开发者补验,不记为已通过。
作者系列 UTS 插件
以下列表由项目核实的已发布清单生成;本插件尚未上架,暂不加入系列清单。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-alipay-kit |
支付宝授权登录、App 支付与脱敏诊断 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-hce-card |
NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 | 查看插件 |
lizhao-health |
健康数据授权、查询、统计与写入 | 查看插件 |
lizhao-http-server |
本地 HTTP 服务、文件传输与实时通信 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-id-photo |
证件照制作、尺寸换算、换底色与模板换装 | 查看插件 |
lizhao-img-eraser |
图片去水印、局部修复与原生编辑器 | 查看插件 |
lizhao-live-activity |
实时活动、系统胶囊与普通通知降级 | 查看插件 |
lizhao-live-photo |
实况照片选取、展示预览与原件处理 | 查看插件 |
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |
lizhao-novel-reader |
原生小说阅读、仿真翻页与段落评论 | 查看插件 |
lizhao-office-view |
Office 与 PDF 文件预览、进度与缓存管理 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-usb-storage |
U 盘、移动硬盘文件浏览、读写与批量复制 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-video-feed |
短视频上下滑、短剧选集与分页加载 | 查看插件 |
lizhao-video-player |
原生视频播放器、清晰度与播放交互 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12745935
赞赏 1959
赞赏
京公网安备:11010802035340号