You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端Credential Manager抛出错误[28404] failed to retrieve an ID Token求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:38:05