注册登录流程

共 20 题
📑 题目列表 20 题
#
★★★

1. 密保问题 + 邮件 + Passkey 多因子分级风控的工程价值

将密保问题、邮件验证码与 Passkey 组合在一起,如何实现多因子分级风控?其工程价值是什么?

  • 多因子分级(渐进式)风控的思路
  • 各因子在风控中的角色与强度
  • 前端如何编排分级认证流程

多因子分级风控的核心是"依据操作风险等级差异化要求认证强度":低风险操作(如普通查看)仅以 Passkey 或已登录会话即可;中等风险(如修改资料)要求 Passkey + 邮件验证码;高风险(如换绑手机、大额支付)则叠加密保问题或二次 Passkey。密保问题作为"古代记忆因素"强度偏弱,邮件作为"获取的验证因素",Passkey 作为"强认证因素"(防钓鱼)。前端需按风险等级动态编排步骤,先轻后重,避免对低风险操作过度打扰。工程价值在于在安全与体验间取得平衡,降低误报率与用户流失。

"分级而非一刀切"是成熟风控的核心思想。回答时强调"按风险等级动态决定认证因子"与"弱因子配合强因子"的组合逻辑,能体现工程与产品思维。

#
★★★

2. 条件式 Passkey 注册 vs 强制 Passkey 升级路径在用户体验的工程取舍

条件式(Conditional)Passkey 注册与强制 Passkey 升级路径在用户体验上有什么工程取舍?如何选择?

  • 条件式注册(渐进式)与强制升级的区别
  • 两种路径的 UX 与转化影响
  • 选择策略与数据驱动

条件式注册(如登录成功后提示"启用 Passkey"、支付成功页 upsell)不打断主线流程,用户可自愿选择,转化温和、挫败感低,适合用户基数大、每步转化都很宝贵的场景。强制升级路径(如强制要求用户注册 Passkey 才能继续)安全推进更快、新用户覆盖率高,但会打断操作、增加流失与客服压力。工程取舍:通常采用"条件式切入 + 分阶段引导"——先弹性引导,统计注册率与回退原因,再对高价值/高风险流程适当提高强度。最终以数据(注册率、流失率、客服工单)决定是否升级为强制。

"渐进式 vs 强制"是身份认证产品化的经典取舍。回答时突出"先弹性后强制、以数据驱动"的务实路径,并点出两者对转化与安全的不同影响,能体现产品判断力。

#
★★★

3. RP ID 与域名绑定、Same-Origin 约束

WebAuthn 的 RP ID 与域名绑定、Same-Origin 约束是什么?它们如何影响多子域部署与多域名场景?

  • RP ID 的语义与作用域
  • Same-Origin 约束
  • 多子域/多域名部署的取舍

RP ID 是 WebAuthn 凭证的"作用域"标识,凭证绑定到 RP ID(如 example.com),其 rpIdHash 会进入认证器签名。RP ID 必须是被调用者 host 的"可注册域后缀"(即父域),因此 example.com 的 RP ID 可被 login.example.com、app.example.com 等子域共享,实现跨子域复用同一凭证;但任意子域无法单独使用不属于它的 RP ID。Same-Origin 约束则要求调用 navigate 的页面 origin 与 RP ID 匹配。这带来部署影响:多子域可用一个 RP ID 共享凭证,但真正的多域名(不同顶级域)必须各自注册凭证,或借助 SSO/IdP 桥接。

RP ID 与 Same-Origin 是 WebAuthn 的"账号边界"。理解"子域可共享、跨域名不可"的规则,能避免多域名业务中凭证失效的坑,也是设计企业级多租户/多品牌的基础。

#
★★★

4. Passkey fallback 到 OTP(webauthn-helper/simplewebauthn)

当 Passkey 不可用或认证失败时,如何回退到 OTP(短信/邮箱验证码)?使用 webauthn-helper 或 simplewebauthn 这类库如何实现?

  • Passkey 失败的理解与降级策略
  • OTP 回退流程
  • 用库封装的工程实现

Passkey 可能因设备不支持、生物识别失败、无可用凭证等原因失败,此时应回退到 OTP。流程设计:先 feature detection 判断是否支持 WebAuthn,再尝试 credentials.get;若抛错(如 NotAllowedError、SecurityError)或用户取消,则进入 OTP 通道(发送到绑定邮箱/手机并校验)。simplewebauthn(@simplewebauthn/browser 的 startRegistration/startAuthentication)与 webauthn-helper 封装了编码转换、错误归一化等细节,前端只需处理 start 返回的预期数据与错误分类。工程上把"Passkey 优先、OTP 兜底"做成统一的认证服务,前端通过一个标志位切换,保证体验一致并记录回退原因。

"Passkey 优先、OTP 兜底"是渐进式无密码的标准做法。回答时点出"错误分类决定回退时机"与"用库简化二进制处理"两个工程要点,能体现落地能力。

import { startAuthentication } from "@simplewebauthn/browser";
try {
  const assertion = await startAuthentication({ optionsJSON });
  // 提交给后端验证
} catch (err) {
  if (err instanceof Error && err.name === "NotAllowedError") {
    // 用户取消或认证失败,走 OTP 回退
    return goToOtpFallback();
  }
  throw err;
}
#
★★★

5. Passkey 注册流程的 user-agent 客户端能力探测的工程价值

在 Passkey 注册流程中,为什么需要做 user-agent 客户端能力探测?其工程价值是什么?

  • 能力探测(feature detection)的内容
  • 探测结果对 UI/流程的驱动
  • 避免"假支持"的坑

能力探测用于在注册前判断当前浏览器/设备是否真正支持 WebAuthn 与 Passkey,避免给用户展示无法使用的按钮或流程。探测内容包括:是否在安全上下文(HTTPS)、是否支持 PublicKeyCredential、是否支持 platform authenticator、是否支持条件 UI(conditional UI)、是否支持 isUserVerifyingPlatformAuthenticatorAvailable() 等。探测结果驱动 UI 分支(是否显示"使用 Passkey"入口、提示文案、注册按钮置灰)与流程。工程价值在于提升体验一致性、减少无效操作;注意"探测到支持"不等于"注册一定成功",仍要处理加载失败与降级。

能力探测是"渐进增强"在认证里的落地。回答时点出"探测结果驱动 UI 与流程分支"以及"探测成功≠操作成功"的边界,能体现工程严谨性。

const platformAvailable = await PublicKeyCredential
  .isUserVerifyingPlatformAuthenticatorAvailable?.();
const conditional = window.PublicKeyCredential
  ?.isConditionalMediationAvailable?.();
if (window.isSecureContext && platformAvailable) {
  // 展示 Passkey 注册入口
}
#
★★★

6. Passkeys + Password 混合模式作为降级方案

如何设计"Passkeys + Password"混合模式作为降级方案?为什么不能完全移除密码?

  • 混合认证模式的意义
  • 密码作为降级通道的作用
  • 过渡期的产品策略

混合模式指 Passkey 与密码并存,Passkey 作为首选、密码作为兜底。原因:用户设备可能不支持、生物识别失败、用户习惯、跨设备不便等场景仍需密码;且彻底移除密码会让无法注册 Passkey 的用户被锁死。设计上:注册时优先 suggest Passkey,但保留密码注册;登录时先尝试 Passkey,失败/取消则回退到"账号+密码";设置页允许用户管理 Passkey 与密码。过渡期可逐步提高 Passkey 的优先级,用数据观察 Passkey 覆盖率达到阈值后再考虑弱化密码。这是"渐进式无密码"的稳妥路径。

"混合模式"兼顾安全迁移与可用性。回答时点出"密码是最后的兜底通道,不能一刀切移除"与"以数据驱动逐步弱化密码"的产品节奏,是成熟做法。

#
★★

7. WebAuthn 的 transports(usb、nfc、ble、internal)的现代应用

WebAuthn 的 transports(usb、nfc、ble、internal)各代表什么?在现代前端开发中如何应用?

  • transports 四种取值含义
  • 对身份认证器选择的影响
  • 在前端 hint 与后端提示的应用

transports 描述认证器支持的传输方式:usb(USB 连接)、nfc(近场通信)、ble(蓝牙)、internal(平台内建,如指纹/Face ID)。它们用于:注册时在 PublicKeyCredential 上提供的 transports 字段向后端报告认证器能力;登录时前端可在 allowCredentials 中为每个凭证指定 transports 为 browser hints,帮助浏览器优先匹配可用传输;后端在向用户展示"如何操作认证器"时也可据此提示(如"请将安全密钥贴近手机")。现代应用重点是"internal"代表平台认证器,配合跨设备登录(hybrid)时通常用 internal 或混合。

transports 是"能力描述 + 交互提示"的双重载体。回答时点出"注册时上报、登录时作为 hint、UI 据此做提示文案"三个应用点,能体现工程落地。

#
★★

8. WebAuthn 的 Challenge 在服务端生成的工程边界与防重放

WebAuthn 的 challenge 为什么必须在服务端生成?其工程边界与防重放机制是什么?

  • challenge 必须服务端生成的原因
  • challenge 的存续与一次性
  • 防重放的工程实现

challenge 必须在服务端生成且随机,因为如果由前端生成,攻击者可以控制 challenge,破坏防重放。工程上:服务端生成 challenge 后,在会话/短期存储中保存"challenge 与用户、操作、过期时间"的关联记录;前端拿到 challenge 调用 create/get;认证器签名包含 challenge;服务端验签时核对 challenge 是否与会话记录一致、是否过期、是否已使用(一次性)。过期时间(如 5 分钟)与一次性使用防止重放攻击——即使攻击者截获签名,也无法在 challenge 过期后复用。工程边界:challenge 只用于"防重放",不用于"认证"本身,真正的信任来自签名与公钥。

"challenge 由服务端生成并一次性校验"是防重放的核心。回答时点出"服务端保留 challenge 关联记录 + 过期 + 一次性"三个要件,并强调 challenge 与签名验证的分工,能体现安全设计能力。

#
★★

9. Passkeys 的跨设备登录(Hybrid Transport via QR)

Passkeys 如何通过 Hybrid Transport(QR 码)实现跨设备登录?其流程与工程注意点是什么?

  • Hybrid transport 的 QR 流程
  • 手机端与电脑端的协作
  • 工程注意点(安全与降级)

跨设备登录(Hybrid)流程:电脑端调 navigator.credentials.get 且允许跨设备,浏览器显示 QR 码;手机端用相机扫描 QR,读取握手信息(含通过 BLE/局域网建立的连接数据);手机端在本地完成生物识别(Passkey)后,通过该通道把签名回传给电脑端;电脑端把 assertion 提交给服务端验证。工程注意点:QR 码会过期需刷新;需处理 BLE/局域网不可用时的降级;注意拒绝重放与中间人攻击(QR 握手需绑定会话);手机端需支持 Passkey 且已同步该 RP 的凭证或可注册。这是"无本地认证器的电脑 + 手机 Passkey"的最佳体验。

Hybrid 把"手机 Passkey"延伸到桌面端,是跨设备体验的关键。回答时点出"QR 握手 → 手机认证 → 回传签名"的链路与安全/降级考虑,能体现对跨设备认证的理解。

#
★★

10. WebAuthn 的 Public Key Credential 在多账户管理的工程应用

WebAuthn 的 Public Key Credential 在多账户管理中有哪些工程应用?如何管理同一用户多个凭证?

  • 多凭证(多设备)的管理
  • 凭证的增删改查
  • 断言时的 allowCredentials 使用

一个用户可拥有多个 Public Key Credential(如笔记本、手机、USB 密钥各一个)。多账户管理的工程应用:服务端维护"用户↔凭证"列表,支持查看、重命名、删除凭证;登录时对可发现凭证可让用户选择账号,或通过 allowCredentials 限定某个凭证;设备丢失时删除该凭证实现"撤销"。前端提供一个"设备/凭证管理"界面,展示凭证名称、创建时间、最后使用时间,并允许用户在登录后删除多余凭证。多凭证提升了冗余与可用性,但需治理"凭证失控"风险(及时删除不再使用的凭证)。

多凭证管理是把 WebAuthn 产品化的必经之路。回答时点出"凭证列表 CRUD + 登录 allowCredentials + 设备丢失撤销"三个应用,能体现完整的工程视角。

#
★★

11. WebAuthn 的 excludeCredentials 在防账户冲突的工程价值

WebAuthn 的 excludeCredentials 如何防止账户冲突?其工程价值是什么?

  • excludeCredentials 的作用
  • 防重复注册/冲突的机制
  • 在多设备场景的应用

excludeCredentials 用于注册(create)时,告诉认证器"这些凭证已被该用户使用,请不要创建重复凭证"。若用户想用同一认证器(或同一同步 passkey)为同一账号再注册,认证器会拒绝创建,从而避免"同一物理密钥被重复注册到同一账号"造成冗余与冲突。工程价值:它防止了误操作导致的凭证重复、也防止攻击者把同一凭证强行绑定到多个账号;在多设备/多凭证场景,它帮助维持"凭证唯一性"。实现上,把用户已有的凭证 ID 列表传给 create 的 excludeCredentials 即可。

excludeCredentials 是"注册去重"的关键。回答时点出"防止同一认证器重复注册导致的冲突/冗余"与"多设备下维持凭证唯一性"两个价值,能体现对注册流程细节的掌握。

#
★★

12. WebAuthn 的 extensions(hmacCreateSecret、appid)的工程应用

WebAuthn 的 extensions(hmacCreateSecret、appid)各有什么工程应用?

  • appid 扩展的用途(兼容 U2F)
  • hmacCreateSecret 的用途
  • 扩展的工程落地

appid 扩展用于兼容旧的 U2F 凭证:让使用旧 appid(U2F 时代用 AppID 而非 RP ID)的凭证在后端迁移后仍能用于登录,从而平滑过渡。hmacCreateSecret 让认证器为 RP 派生一个秘密(HMAC 密钥),不暴露真实密钥,可用于离线加密/数据保护(如"恢复密钥"场景),但需与设备能力配合。工程上:extensions 是可选的,前端在 options 中传入 extensions 对象,在响应中读取扩展输出;需先探测认证器/浏览器是否支持,否则降级。注意浏览器的扩展支持不一致,需谨慎使用。

extensions 是 WebAuthn 的"可插拔能力"。回答时点出"appid 做 U2F 兼容迁移、hmacCreateSecret 做离线密钥派生"并强调"探测支持 + 降级",能体现对扩展机制的务实理解。

#
★★

13. Passkeys 在企业 SSO(SAML/OIDC)的工程集成与边界

Passkeys 如何与企业 SSO(SAML/OIDC)集成?其工程边界是什么?

  • Passkey 与 SSO 的角色分工
  • 在 IdP 侧集成 Passkey
  • 工程边界(联盟信任、会话)

在企业 SSO 中,Passkey 通常作为 IdP(身份提供方)侧的认证因素,而不是应用侧的独立认证。典型流程:用户访问应用(SP)→ 重定向到 IdP → IdP 用 Passkey 认证用户 → 产生 SAML/OIDC 断言 → 应用信任该断言。这样 Passkey 的注册与验证集中在 IdP,SP 只需标准 SSO 流程,无需各自实现 WebAuthn。工程边界:Passkey 是在 IdP 建立信任,SP 依赖 IdP 的断言(信任链);若企业需要 Passkey 绑定到企业目录(如 Entra ID),则需 IdP 支持企业 Passkey;多域名/多品牌场景可借 IdP 统一 RP ID 管理。

"在 IdP 侧做 Passkey、SP 走标准 SSO"是避免重复建设的关键。回答时点出"Passkey 作为 IdP 认证因素 + 信任链边界",能体现企业级集成视角。

#
★★

14. FedCM(Federated Credential Management)在第三方 Cookie 淘汰后如何替代 iframe+PostMessage 的联合登录,navigator.credentials.get({ identity }) 的 IdP 配置(configURL、clientId、nonce)与 mediation 流程、FedCM 登出如何保证 IdP 侧会话同步,以及 Chrome 已支持而 Firefox/Safari 支持度不一致时的功能检测与回退标准?

在第三方 Cookie 淘汰后,FedCM 如何替代 iframe+PostMessage 的联合登录?请说明 navigator.credentials.get({ identity }) 的 IdP 配置(configURL、clientId、nonce)、mediation 流程、FedCM 登出如何保证 IdP 侧会话同步,以及支持度不一致时的功能检测与回退标准?

  • FedCM 替代 iframe+PostMessage 的原因
  • identity provider 配置(configURL、clientId、nonce)与 mediation
  • FedCM 登出与会话同步

第三方 Cookie 淘汰后,iframe+PostMessage 的联合登录(依赖嵌入第三方 iframe 的 Cookie)失效,FedCM 通过浏览器原生 UI 展示"登录提供方"选择,返回 IdP 身份令牌,无需第三方 Cookie。调用 navigator.credentials.get({ identity: { providers: [{ configURL, clientId, nonce }] } }):configURL 指向 IdP 的 well-known 配置(声明 endpoints),clientId 是 RP 在 IdP 的客户端标识,nonce 用于防重放并绑定到返回的令牌。mediation 控制是否显示账户选择(如 required/silent/optional)。FedCM 登出通过调用 IdP 的登出端点并清除 RP 会话,用 status 端点与 logout 机制保证 IdP 侧会话同步。由于 Chrome 支持较好、Firefox/Safari 支持不一,需做功能检测(navigator.credentials.get({identity}) 是否可用),不支持时回退到"重定向到 IdP"的传统 OAuth/OIDC 授权码流程。

这是"第三方 Cookie 淘汰后的标准答案"。回答要覆盖"为何替代、配置三要素、mediation、登出同步、回退"五个点,最能体现对现代联邦登录的完整理解。

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example.com/fedcm.json",
      clientId: "client-123",
      nonce: "random-nonce",
    }],
    mediation: "optional",
  },
});
// 不支持时回退到重定向 OIDC
if (!cred) window.location.href = "/login/oidc";
#
★★

15. WebAuthn 的 Attestation(认证器证明)与 Assertion(断言)

请区分 WebAuthn 的 Attestation(认证器证明)与 Assertion(断言),它们分别出现在哪个流程、有什么作用?

  • Attestation 与 Assertion 的定义
  • 各自所属流程(注册/登录)
  • 数据差异与后端处理

Attestation(认证器证明)出现在注册流程,是认证器对"新创建的凭证"的证明,证明该凭证由真实认证器生成,包含 attestationObject(含公钥、aaguid、签名),用于服务端建立对认证器的信任并保存公钥。Assertion(断言)出现在登录流程,是认证器对"挑战"的签名证明,包含 clientDataJSON、authenticatorData、signature,用于服务端验证"用户确实持有对应私钥"。简言之:Attestation 证明"凭证来自可信认证器"(注册),Assertion 证明"用户拥有私钥"(登录)。后端分别用 verifyRegistrationResponse 与 verifyAuthenticationResponse 处理。

两者常被混淆,区分"注册时证明凭证来源"与"登录时证明持有私钥"是关键。回答时点出流程归属与后端处理差异,能体现对协议两阶段的理解。

#
★★

16. WebAuthn 的 User Verification(UV)

什么是 WebAuthn 的 User Verification(UV)?它与 User Presence(UP)有什么不同?前端如何配置?

  • UV 与 UP 的区别
  • UV 的实现(生物识别/PIN)
  • authenticatorSelection.userVerification 的工程配置

User Verification(UV)指"认证器验证用户本人身份",通常通过生物识别(指纹、Face ID)或 PIN 完成,要求用户主动提供个人验证信息;User Presence(UP)则只要"用户与认证器交互"(如触摸 USB 密钥按钮),不一定是本人。UV 比 UP 安全等级更高。前端通过 authenticatorSelection.userVerification(required/preferred/discouraged)配置,required 强制 UV(安全性最高,但可能因设备不支持而失败),preferred 折中(支持则用、否则回退 UP)。authenticatorData 中的 UV 标志位(UV bit)可让服务端判断本次是否完成 UV。

UV 与 UP 是 WebAuthn 安全分级的核心概念。回答时点出"UV 验证本人、UP 仅验证交互"及"required 与 preferred 的取舍",能体现对安全语义的理解。

#
★★

17. WebAuthn 的 residentKey 与 requireResidentKey 在用户体验的工程应用

WebAuthn 的 residentKey 与 requireResidentKey 有什么区别?它们在用户体验上有什么工程应用?

  • residentKey 与 requireResidentKey 的关系
  • 可发现凭证(discoverable credential)的意义
  • 对"无用户名登录"体验的影响

requireResidentKey 是早期字段(布尔值),residentKey 是后来的枚举值(required/preferred/discouraged),两者语义一致:决定是否创建可发现凭证(resident key)。可发现凭证在认证器上存储凭证与用户关联信息,使登录时无需先输用户名即可枚举凭证(借助 conditional UI 或凭证列表),实现"无用户名登录"的流畅体验。工程上,做"无密码、无用户名"体验应设 residentKey: "required" 或 "preferred";但 residentKey 会占用认证器存储,且旧认证器可能不支持,故需配合降级(如回退到要求输入用户名)。preferred 是折中:支持则做可发现凭证,否则退回。

"可发现凭证"是清爽无密码登录的前提。回答时点出"residentKey 控制无用户名登录、preferred 兼顾兼容"与"占用存储/支持度导致的降级",能体现工程取舍。

#

18. WebAuthn 的 timeout 在认证器选择的工程实践

WebAuthn 的 timeout 参数是什么?在认证器选择与用户体验上有什么工程实践?

  • timeout 的含义与单位
  • 超时处理与交互反馈
  • 与认证器交互时长的关系

timeout 是 WebAuthn 允许认证器交互的最长时间(毫秒),用于控制 create/get 等待用户操作认证器的时长。工程实践:设置合理的 timeout(如 60 秒)避免用户长时间无响应;超时后 API 抛错(如 TimeoutError),前端应清理 UI、提示用户并允许重试;有些场景(如等待用户插入 USB 密钥、扫描 QR)可能需要更长时间,可适当放宽。timeout 协调"等待用户操作"与"服务器 challenge 有效期"的关系——通常让 timeout 略小于挑战过期时间,避免签名到达时 challenge 已失效。

timeout 是"交互等待"与"服务端 challenge 有效期"之间的衔接。回答时点出"超时后清理/重试"与"与 challenge 有效期联动"两个工程点,能体现细节把控。

#

19. Passkeys 的备份与恢复策略(iCloud Keychain、1Password)

Passkeys 的备份与恢复策略如何设计?iCloud Keychain、1Password 等如何参与?

  • 备份与恢复的意义
  • 平台/密码管理器的备份机制
  • 恢复的工程考虑

Passkey 备份与恢复关乎"设备丢失/更换后能否找回凭证"。Apple 的 iCloud Keychain 通过端到端加密自动备份 passkey,绑定 Apple ID 与设备解锁,新设备登录后自动恢复;Google 通过 Google Password Manager 同步;第三方密码管理器(如 1Password、Bitwarden、Dashlane)可作为独立备份通道,把 passkey 存储在用户主密码+端钥加密的保险库中。工程上:RP 应检测凭证的 Backup Eligibility/State,告知用户凭证是否随账号备份;同时提供"多凭证"冗余(多设备注册多个凭证)与"重新注册"兜底。恢复策略重点是:用户迁移到新设备时能通过平台账户或密码管理器取回 passkey,且不降低安全性(端到端加密)。

"备份≠端到端加密之外的安全弱点"是核心。回答时点出"平台自动备份 + 密码管理器独立备份 + 多凭证冗余 + 重新注册兜底"的组合,能体现完善的恢复设计。

#

20. WebAuthn 的服务端验证(Signature、Challenge)

WebAuthn 的服务端验证需要做什么?如何处理 Signature 与 Challenge?

  • 服务端验证的步骤
  • 签名校验与 challenge 校验
  • 常用库与流程

服务端验证分两阶段:注册验证(verifyRegistrationResponse)与登录验证(verifyAuthenticationResponse)。核心步骤:解析 clientDataJSON(校验 type 与 challenge、origin);解析 authenticatorData(校验 rpIdHash、UV 标志);用 COSE 恢复公钥并验证 signature;核对 challenge 是否为会话中下发的、未过期、未使用(防重放);检查 signCount(防止克隆/重放)。工程上多用 @simplewebauthn/server 封装这些步骤,前端只需把 attestation/assertion 原始数据传给后端。前端职责是确保采集的二进制完整、base64url 编码正确,后端职责是安全校验。

"前端采集、后端校验"是 WebAuthn 的安全分工。回答时点出"challenge/origin/rpIdHash/signature/counter 五要素校验"并用库封装,能体现对服务端安全边界的理解。