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

Web端Passkeys实现问题:移动端注册后登录提示无可用密钥

问题分析与可能的解决方案

你的核心问题是:安卓Firefox原生Passkey存储无法识别已注册的凭证,但Bitwarden和passkeys.io可以正常工作,Github也存在相同现象。结合你提供的登录参数和场景,可能的原因及解决方向如下:

1. RP ID的域名匹配规则差异

Firefox对Passkey的RP ID(依赖方ID)验证可能比其他浏览器更严格,尤其是针对临时/共享域名(如ngrok-free.app):

  • passkeys.io使用**顶级注册域名(eTLD+1)**作为RP ID(即passkeys.io),完全符合WebAuthn规范中RP ID必须是当前origin的注册域名或其上级域名的要求。
  • 你的ngrok域名xxxxx.ngrok-free.app中,ngrok-free.app是eTLD+1(.app为公共后缀)。如果注册Passkey时使用的RP ID是完整子域名xxxxx.ngrok-free.app,Firefox原生存储在匹配时可能优先匹配eTLD+1级别的域名,导致登录时无法定位对应凭证。
  • 验证方式:检查注册Passkey时传递的rp.id是否与登录时的rpId完全一致;尝试将RP ID改为ngrok-free.app(需确保你的origin属于该域名的子域),再测试注册和登录流程。

2. 缺少allowCredentials参数

你当前的登录请求仅传递了challenge、rpId、timeout和userVerification,未包含allowCredentials数组。这个参数用于指定浏览器需查找的特定凭证,帮助精准定位已注册的Passkey:

  • passkeys.io在登录时通常会根据用户ID返回对应的allowCredentials(包含凭证ID、类型和算法),让浏览器直接匹配目标凭证,避免遍历所有存储的Passkey。
  • Firefox安卓的原生Passkey存储可能在无allowCredentials时,无法正确筛选对应域名的凭证,而Bitwarden作为第三方管理器有更完善的筛选逻辑。
  • 解决办法:在登录请求中添加allowCredentials数组,包含该用户已注册Passkey的id(Uint8Array格式)、type: "public-key",以及对应的算法alg(如-7对应ES256)。

3. UserVerification参数的一致性问题

确保注册和登录时的userVerification参数保持一致:

  • 如果注册Passkey时设置的是userVerification: "required",但登录时用的是"preferred",Firefox可能因验证要求不匹配过滤掉凭证。
  • 检查注册请求中的authenticatorSelection.userVerification值,确保和登录时的userVerification一致(建议统一设为"preferred"或"required")。

4. Firefox安卓原生Passkey的临时域名限制

ngrok这类临时域名可能被Firefox的安全策略标记为不可信,导致原生Passkey存储无法正常检索凭证,而passkeys.io作为正规备案域名不受此限制:

  • 测试方式:将部署环境切换到自己的正规顶级域名,再测试安卓Firefox的原生Passkey登录,验证是否能正常识别凭证。

补充验证步骤

  1. 打开安卓Firefox的about:logins页面,查看已保存Passkey的RP ID是否与登录时传递的rpId完全一致。
  2. 注册Passkey后,打印返回的凭证对象,确认response.userHandle和id的值,登录时将id加入allowCredentials数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:32:48