Unity Android端SignInWithGoogleAsync报PERMISSION_DENIED错误
Unity接入Google登录报401 PERMISSION_DENIED解决方案
触发场景:获取Google ID令牌传入Unity Authentication服务时返回错误:
[Authentication]: Request failed: 401, {"title":"PERMISSION_DENIED","detail":"validation failed","details":[],"status":401}WebRequestException: {"title":"PERMISSION_DENIED","detail":"validation failed","details":[],"status":401}
根因定位
代码里传入SignInWithGoogleAsync的参数完全错误:
// 错误:GetUserId()返回的是Google Play Games分配的用户唯一ID,不是服务要求的ID令牌 string idToken = PlayGamesPlatform.Instance.GetUserId();
Unity Authentication的Google登录接口要求传入Google签发的OpenID Connect ID Token,用户ID是普通字符串,无法通过令牌校验,直接返回401。
代码修正
将获取令牌的逻辑替换为GetIdToken()方法,修正后的登录回调代码:
async void OnGooglePlayGamesLogin(bool success) { if (success) { // 正确获取Google ID Token string idToken = PlayGamesPlatform.Instance.GetIdToken(); if (string.IsNullOrWhiteSpace(idToken)) { Debug.LogError("ID Token获取失败,检查Play Games配置"); return; } await SignInWithGoogleAsync(idToken); } else { Debug.Log("Google Play Games登录失败"); } }
必查配置项
代码改完如果还报错,按以下顺序核对配置,缺项都会触发校验失败:
- Google Cloud控制台创建OAuth客户端时,必须额外创建一个Web应用类型的客户端ID,Unity Authentication和Play Games插件请求ID Token都要用这个Web客户端ID,不能直接用Android类型的客户端ID
- Unity中Google Play Games插件配置(Window > Google Play Games > Setup > Android Setup):
- 正确填写Google Play后台分配的应用ID
- 导入从Google Play后台下载的官方配置资源
- 勾选
Request IdToken选项,填入前面创建的Web应用客户端ID - 确认配置后重新生成AndroidManifest和相关资源文件
- Unity Dashboard后台Authentication配置页:
- 开启Google登录方式
- 客户端ID字段填入同一个Web应用客户端ID,保存配置
- 签名校验:Google Cloud控制台中Android类型OAuth客户端填的SHA1指纹,必须和你打包用的keystore指纹一致,调试keystore和发布keystore要分别添加对应指纹
- 测试环境注意:Google Play Games插件不支持Unity编辑器环境,必须打Android真机包测试,编辑器下测试会拿不到有效ID Token
额外排查点
- 不要用
Social.localUser的通用社交接口取令牌,该跨平台封装拿不到Google专属的ID Token字段,必须直接调用PlayGamesPlatform.Instance的方法 - 改完配置后建议清除应用数据、重新初始化Unity Services再测试,避免旧缓存导致校验异常
- 若仍报错,可以解码拿到的ID Token检查
aud字段,该字段值必须和Unity后台配置的Web客户端ID完全一致,不一致就说明令牌请求时填的客户端ID错了
内容的提问来源于stack exchange,提问作者Wheels Wheelerson
相关产品推荐
相关产品推荐

