Flutter集成Google Play Games登录报ApiException:10 配置SHA-1仍报错
错误码10属于DEVELOPER_ERROR,本质是客户端请求的签名、包名、客户端ID和Google后台登记的信息不匹配。在你已经完成SHA-1配置、OAuth客户端创建、同意屏幕发布的前提下,重点排查以下几个绝大多数人会踩的遗漏点:
删掉代码里多余的配置参数
你当前代码里手动传入了clientId和hostedDomain,这是触发10错误的最高频原因。使用SignInOption.games(即Google Play Games登录)模式时,Google服务会自动从应用和Play Games后台的关联配置里拉取合法的客户端ID,不需要手动指定。hostedDomain仅适用于Google Workspace托管域的账号登录场景,普通C端游戏账号登录不需要配置这个参数,传值错误会直接被服务端判定为非法请求。补全所有要求的SHA-1指纹
不要只加本地发布keystore的SHA-1:- 本地调试必须额外添加debug.keystore的SHA-1指纹
- 如果开启了Google Play应用签名(Play App Signing),必须同时在Google Cloud/Firebase控制台、Play Games控制台添加Google Play后台展示的应用签名证书SHA-1和上传证书SHA-1,仅添加本地上传keystore的指纹会导致从Play商店安装的包100%触发10错误
- 新增SHA-1后最长需要2小时同步生效,不要刚加完就测试
确认Play Games服务配置完整且已发布
游戏登录不能只配Google Cloud/Firebase侧的OAuth客户端,必须在Google Play控制台完成Play Games服务的配置:- 完成Play Games服务基础信息填写,关联和你安装包包名一致的应用
- 为对应构建变体创建登录凭据,凭据绑定的包名、SHA-1必须和你测试的安装包完全匹配
- 确认Play Games服务不是草稿状态,已完成发布
- 如果服务还在测试阶段,必须把你用来测试的Google账号加到Play Games测试者列表、同时加到OAuth同意屏幕的测试用户列表里,哪怕是开发者自己的账号也需要加
清理缓存避免旧配置干扰
每次改完配置重新测试前,先卸载设备上已安装的测试包,同时清除Google Play服务、Google Play游戏的应用缓存,本地残留的旧凭据缓存会导致配置更新后依然报错。
修正后的代码参考
Future<AuthCredential?> getGoogleCredential() async { print('Inside getGoogleCredential'); final GoogleSignIn googleSignIn = GoogleSignIn( signInOption: SignInOption.games, scopes: [GamesApi.gamesScope], // 移除手动传入的clientId、hostedDomain参数 ); print('google Sign in currentUser: ${googleSignIn.currentUser}'); final GoogleSignInAccount? googleUser = await googleSignIn.signIn().catchError((error) { print('Failed to sign in with Google Play Games: $error'); return null; }); print('google User is ${googleUser}'); if (googleUser == null) { print('Failed to sign in with Google Play Games.'); return null; } final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); return credential; } Future signIn() async { final AuthCredential? googleCredential = await getGoogleCredential(); if (googleCredential != null) { await FirebaseAuth.instance.signInWithCredential(googleCredential); } else { print('Trying signInAnonymously'); await FirebaseAuth.instance.signInAnonymously(); } }
快速定位技巧:可以临时把
signInOption改成SignInOption.standard测试,如果标准Google登录能正常唤起、只有games模式报错,问题100%出在Play Games服务侧的配置,和通用OAuth配置无关。
内容的提问来源于stack exchange,提问作者Utkarsh Karnik

