Android 14下React Native Passkey的createCredential报错求助
问题概述
在 React Native 应用中集成 f-23/react-native-passkey 实现 Passkey 功能时,iOS 17.2 运行正常,但 Android 14(Pixel 7 API 34)注册流程抛出以下错误:
{ "error": "Native error", "message": "androidx.credentials.exception.CreateCredentialCustomException:" }
错误触发自注册代码中的 await Passkey.register(publicKeyCredentialCreationOptions),底层对应库中 PasskeyModule.kt 第34行的 credentialManager.createCredential 调用。已配置 Digital Asset Links,但问题仍存在。
可能的原因分析
- RP ID 不合法:使用
localhost作为 RP ID 无法通过 Android 端的资产链接验证,Google Password Manager 要求 RP ID 必须对应已通过 Digital Asset Links 验证的真实域名。 - Digital Asset Links 验证失败:
- SHA256 证书指纹与当前构建版本不匹配(debug/release 指纹不同)
assetlinks.json格式错误(如 SHA 值大小写、空格问题)- 域名未配置正确的 HTTPS,或
assetlinks.json无法被公开访问
- 密钥算法兼容性问题:
pubKeyCredParams中包含的-257(RSASSA-PKCS1-v1_5)算法可能未被部分 Android 14 设备或 Google Password Manager 支持。 - Google Password Manager 配置异常:设备未登录有效 Google 账号,或 Password Manager 禁用了 Passkey 功能。
- 库版本适配问题:
react-native-passkey的 stable 版本对 Android 14 的 CredentialManager API 存在适配缺陷。
调试与修复建议
1. 替换 RP ID 为真实域名
将 publicKeyCredentialCreationOptions 中的 rp.id 改为与 assetlinks.json 所在域名一致的真实域名(例如 yourdomain.com),localhost 无法通过 Android 端的 Passkey 域名验证逻辑。
2. 重新验证 Digital Asset Links
- 确认使用的 SHA256 指纹为当前构建版本的指纹:debug 包用 debug 指纹,release 包用 release 指纹,可通过
./gradlew signingReport命令获取。 - 检查
assetlinks.json的格式:确保 SHA 值无空格、大小写正确,且relation包含delegate_permission/common.get_login_creds。 - 验证文件可访问性:确保文件通过 HTTPS 公开访问,且 Content-Type 为
application/json。
3. 调整密钥算法参数
暂时移除 -257 算法,仅保留 -7(ES256)算法,测试是否能正常注册:
"pubKeyCredParams": [ { "alg": -7, "type": "public-key" } ]
ES256 是 Passkey 标准推荐的算法,兼容性更好。
4. 捕获详细错误信息
修改 PasskeyModule.kt 的异常捕获逻辑,获取 CreateCredentialCustomException 的详细错误内容:
try { val result = currentActivity?.let { credentialManager.createCredential(it, createPublicKeyCredentialRequest) } // 处理成功逻辑 } catch (e: CreateCredentialCustomException) { // 打印详细错误信息 Log.e("PasskeyError", "Custom Exception: ${e.errorMessage}, Type: ${e.type}") // 将详细错误返回给 JS 层 promise.reject("Native error", "CreateCredentialCustomException: ${e.errorMessage} (Type: ${e.type})") }
通过 Logcat 查看具体错误类型,定位问题根源。
5. 检查 Google Password Manager 状态
- 确认设备已登录有效的 Google 账号,且在系统设置中启用了 Google Password Manager 的 Passkey 功能。
- 清除 Google Password Manager 的应用缓存,重启设备后重新测试。
6. 升级库版本
检查 react-native-passkey 的最新版本,查看是否有针对 Android 14 的修复补丁,尝试升级到最新版本后重新测试。
内容的提问来源于stack exchange,提问作者Yakir

