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

Android 14下React Native Passkey的createCredential报错求助

Android 14 上 react-native-passkey 注册失败:CreateCredentialCustomException 排查方案

问题概述

在 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 域名验证逻辑。

  • 确认使用的 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:56:15