Android端Credential Manager抛出错误[28404] failed to retrieve an ID Token求助
遇到这个问题真的挺闹心的——大部分用户用着好好的,偏偏有小部分用户反馈弹出这个错误,排查起来还没头绪。先看看你贴的这段代码:
val signInWithGoogleOption = GetSignInWithGoogleOption.Builder( serverClientId = "xxxxxx-xxxxxxx....." // DEV ).build() val request = GetCredentialRequest.Builder() .addCredentialOption(signInWithGoogleOption) .build() lifecycleScope.launch { try { val result = CredentialManager.create(this@LoginActivity).getCredential( request = request, context = this@LoginActivity ) handleSignIn(result) } catch (e: Exception) { if (e is GetCredentialCancellationException) { this@LoginActivity.showShortToast(getString(R.string.cancel)) } else { this@LoginActivity.showShortToast( e.message ?: getString(R.string.server_error_alert) ) } } }
针对错误[28404] failed to retrieve an ID Token,我给你梳理几个实战中验证有效的排查方向:
核对Server Client ID与应用配置的匹配性
这是最常见的原因!你代码里用的是DEV环境的serverClientId,要确认出问题的用户是不是用了和这个ID不匹配的包(比如误装了release包,但DEV的Client ID没配置release的签名指纹)。一定要去Google Cloud控制台,找到对应的Web应用类型的OAuth 2.0 Client ID,检查它的已授权的Android应用列表里,是不是把对应环境的包名和签名指纹都加全了——不管是debug还是release,指纹和包名一个都不能错,Credential Manager对这个校验特别严格。检查用户设备的Google Play服务版本
错误28404经常和旧版本的Google Play服务挂钩,Credential Manager的很多核心逻辑都依赖Google Play服务来实现,旧版本可能存在API兼容问题或者已知bug。你可以在代码里加个前置检查:用GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)判断版本是否达标,低于最低要求的话,就引导用户去Google Play更新服务;另外在捕获异常时,也可以针对性地给用户提示“请更新Google Play服务后重试”。排查用户设备的Google账号状态
有些用户的设备可能没登录有效Google账号,或者账号存在异常(比如账号被临时限制、两步验证设置有问题),都会导致无法获取ID Token。你可以在调用Credential Manager之前,先通过AccountManager或者Google Sign-In API检查设备上是否有已登录的Google账号,如果没有的话,先引导用户登录账号再进行验证流程。优化异常日志,精准定位问题
你现在的异常处理只捕获了取消异常,其他异常只提示了简单信息,不利于排查。建议在catch块里把异常的堆栈信息打出来,比如:} catch (e: Exception) { if (e is GetCredentialCancellationException) { this@LoginActivity.showShortToast(getString(R.string.cancel)) } else { Log.e("CredentialManagerErr", "获取凭证失败", e) val errorMsg = e.localizedMessage ?: getString(R.string.server_error_alert) this@LoginActivity.showShortToast(errorMsg) } }这样用户反馈问题时,你能拿到更详细的错误上下文,方便定位是网络问题、账号问题还是配置问题。
考虑网络环境影响
部分用户可能处于网络受限的环境(比如企业内网、VPN),导致无法正常连接Google的身份验证服务器,进而获取不到ID Token。这种情况下,可以在异常提示里增加“请检查网络连接后重试”的内容,帮助用户排查。
内容来源于stack exchange

