创建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
相关产品推荐
相关产品推荐

