
webauthn(web authentication api)作为一种现代的、无密码的认证标准,允许用户通过生物识别(如指纹、面部识别)或硬件安全密钥进行身份验证。在webauthn的凭证创建(navigator.credentials.create)或获取(navigator.credentials.get)过程中,publickeycredentialcreationoptions 或 publickeycredentialrequestoptions 对象中包含一个关键参数 timeout。
timeout 参数用于指定用户完成认证操作的最长时间(以毫秒为单位)。如果用户未能在指定时间内完成操作(例如,未在指纹传感器上放置手指,或未完成面部识别),认证请求应自动终止并返回超时错误。这对于提升用户体验和系统安全性至关重要,可以避免请求长时间挂起,并限制攻击者尝试认证的时间。
以下是一个典型的WebAuthn凭证创建请求的publicKey配置示例,其中包含了timeout参数:
const publicKey = {
    "challenge": "testchanllengevalue",
    "rp": { "name": "test.com" },
    "user": {
      "id": "12345-543212-12345-54321",
      "name": "NAME",
      "displayName": "NAME"
    },
    "attestation": "direct",
    "timeout": 20000, // 期望的超时时间,单位毫秒
    "authenticatorSelection": {
      "authenticatorAttachment": "platform",
      "requireResidentKey": false,
      "userVerification": "required"
    },
    "pubKeyCredParams": [
      { "type": "public-key", "alg": -7 },
      { "type": "public-key", "alg": -257 }
    ]
};
// 调用WebAuthn API
navigator.credentials.create({ 'publicKey': publicKey })
    .then(credential => {
        console.log("凭证创建成功:", credential);
    })
    .catch(error => {
        console.error("凭证创建失败:", error);
        // 处理超时错误,例如:if (error.name === "TimeoutError") { ... }
    });尽管上述timeout参数在桌面浏览器上通常能按预期工作,即在指定时间后终止请求,但在某些移动设备上,尤其是在旧版本的Android系统上,开发者可能会观察到该参数无效,认证请求会无限期地等待用户操作,直到用户手动取消或完成。
原因分析:Android平台与Google Play服务
这一行为差异主要源于Android平台上WebAuthn操作的底层实现机制。对于Android 14之前的版本,WebAuthn相关的操作(如指纹识别、面部识别等)通常由Google Play服务(Play Services)进行处理和协调。然而,Play Services在设计上并不完全支持WebAuthn规范中的timeout参数。这意味着,即使在publicKey对象中明确设置了timeout值,Play Services也可能不会强制执行这个时间限制,导致认证请求持续等待。
随着Android系统的演进,WebAuthn的底层实现也在不断优化。在Android 14及更高版本中,WebAuthn操作的处理方式可能有所改变,从而改善了对timeout参数的支持。因此,这种不一致性在较新的Android设备上可能不再是问题,但在仍有大量旧版Android设备在使用的今天,开发者仍需注意此兼容性问题。
除了兼容性问题,timeout参数的数值选择也至关重要。在上述示例中,20000毫秒(即20秒)的超时时间可能仅用于演示目的,但在实际生产环境中,这个值通常过短。
WebAuthn规范(W3C Web Authentication: An API for accessing Public Key Credentials Level 3)对timeout值的推荐如下:
修正后的 timeout 示例:
const publicKey = {
    // ... 其他参数保持不变 ...
    "timeout": 300000, // 推荐设置为至少五分钟 (300,000 毫秒)
    // ...
};综上所述,WebAuthn的timeout参数是优化认证流程的关键组成部分,但在跨平台尤其是移动端(Android < 14)上使用时,需要充分理解其行为差异和底层限制。遵循规范推荐的timeout值,并结合后端超时机制和良好的用户引导,将有助于构建更健壮、更用户友好的WebAuthn认证系统。
以上就是深入理解WebAuthn请求超时机制:移动端兼容性与推荐配置的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                
                                
                                
                                
                                
                                
                                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号