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

创建Passkey凭证成功,调用getCredential时提示无可用凭证

Passkey创建成功但无法通过Credential Manager获取的问题

已在Google账户中成功创建Passkey凭证(可在Google账户管理的密码管理器中查看),使用以下代码创建凭证:

val createPublicKeyCredentialResponse = CredentialManager
    .create(context)
    .createCredential(
        context = context,
        request = createPublicKeyCredentialRequest,
    )

返回的createPublicKeyCredentialResponse数据:

{
    "rawId": "<rawId>",
    "authenticatorAttachment": "platform",
    "type": "public-key",
    "id": "<id>",
    "response": {
        "clientDataJSON": "<clientDataJSON>",
        "attestationObject": "<attestationObject>",
        "transports": [
            "internal",
            "cable"
        ]
    },
    "clientExtensionResults": {
        "credProps": {
            "rk": false
        }
    }
}

但使用以下代码无法获取该凭证:

val getCredentialRequest = GetCredentialRequest(requestChallengeResponse)
val getCredentialResponse = CredentialManager
    .create(context)
    .getCredential(context, getCredentialRequest)

其中getCredentialRequest的数据:

{
    "publicKey": {
        "rpId": "<rpId>",
        "challenge": "<challenge>",
        "timeout": 60000,
        "userVerification": "required",
        "allowCredentials": [
            {
                "id": "<id>",
                "type": "public-key"
            }
        ]
    }
}

调用时捕获到异常:

androidx.credentials.exceptions.NoCredentialException: No credentials available
    at androidx.credentials.CredentialProviderFrameworkImpl.convertToJetpackGetException$credentials_release(CredentialProviderFrameworkImpl.kt:276)
    at androidx.credentials.CredentialProviderFrameworkImpl$onGetCredential$outcome$2.onError(CredentialProviderFrameworkImpl.kt:152)
    at androidx.credentials.CredentialProviderFrameworkImpl$onGetCredential$outcome$2.onError(CredentialProviderFrameworkImpl.kt:143)
    at android.credentials.CredentialManager$GetCredentialTransport.lambda$onError$2(CredentialManager.java:694)
    at android.credentials.CredentialManager$GetCredentialTransport.$r8$lambda$nlbYav9mLBoE6Yh1vFKCvITF3ks(Unknown Source:0)
    at android.credentials.CredentialManager$GetCredentialTransport$$ExternalSyntheticLambda2.run(Unknown Source:6)
    at androidx.credentials.CredentialManager$$ExternalSyntheticLambda0.execute(Unknown Source:0)
    at android.credentials.CredentialManager$GetCredentialTransport.onError(CredentialManager.java:693)
    at android.credentials.IGetCredentialCallback$Stub.onTransact(IGetCredentialCallback.java:123)
    at android.os.Binder.execTransactInternal(Binder.java:1344)
    at android.os.Binder.execTransact(Binder.java:1275)

采用了类似官方Credential Manager示例的实现方式,对比示例应用的请求响应结构一致,且示例可正常运行,但当前代码仅能创建凭证无法获取。


排查方向与解决方案

  • 核对allowCredentials中的id:确保请求中的id和创建凭证返回的id完全一致,包括Base64URL编码格式,避免出现解码/编码错误。
  • 验证rpId匹配性:rpId必须与创建凭证时使用的依赖方ID完全相同,不要包含https://等协议前缀,格式应为类似example.com的域名。
  • 检查userVerification配置:如果创建凭证时未要求用户验证,获取请求中设置userVerification: "required"会导致匹配失败,需调整两者配置一致。
  • 关注credProps.rk字段:返回值rk: false说明该凭证不是常驻密钥(resident key),如果获取逻辑依赖可发现凭证,需在创建请求中设置authenticatorSelection.residentKey为"required"或"preferred"。
  • 统一库版本:确保使用的androidx.credentials库版本与官方示例一致,版本不兼容可能导致凭证存储读取异常。
  • 清除应用缓存重试:应用本地缓存的凭证信息可能异常,清除缓存后重新测试。

内容的提问来源于stack exchange,提问作者Holy Rock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:17:04