-
Notifications
You must be signed in to change notification settings - Fork 0
Security
Passkey-Auth 的核心信任边界在服务端。浏览器负责完成 WebAuthn ceremony,但不能自行宣布“登录成功”。
- WebAuthn challenge 在服务端 session 中生成、绑定并消费
- 标准 Logo 页使用一次性 flow token
- 回跳地址必须经过本地路径检查或 OAuth Client 白名单
- OAuth
state必须由发起方保存并在 callback 校验 - Authorization code 存 hash、绑定 client 与 redirect URI、只能使用一次
- Link Challenge 的
status=success不构成身份凭证 - client secret、server token、session cookie 和 access token 不进入日志或普通 UI
- 注册默认关闭
写操作同时要求:
管理员登录态
+ CSRF token
+ 最近 5 分钟 Passkey reauth
+ 当前 rotating action token
登录或成功 reauth 后,服务端为当前登录 session 签发 action token。浏览器通过
X-Action-Token 发送当前值;服务端只保存与 session、用户绑定的 hash。每次成功
写入都会返回 next_action_token 并立即使旧值失效。缺失、错误或重放旧 token 时,
操作不会执行,客户端必须重新完成 Passkey 验证。
Reauth 只能使用当前管理员的 Passkey,并强制 user verification。回跳后不自动重放危险操作。
OAuth Client 与 callback 从数据库白名单读取。Hyping 的 /api/auth/error 只从已校验的 /api/auth/callback 同源推导,错误回跳仍携带原 state,由 Hyping 再次校验。
不要接受调用方额外传入的任意 error_redirect_uri。
用户有 session_version。停用用户、撤销会话或相关权限变化后,旧 session/access token 会失效。
更换 FLASK_SECRET_KEY 会使所有现有 session 和签名 token 失效;这是运维事件,不是日常轮换方式。
数据库保存 credential public key,不保存私钥。Recovery token 与 Management action token 都只保存 hash。OAuth Client Secret 也以 hash 形式持久化。
登录历史包含 IP 与完整 User-Agent,属于需要按部署地隐私要求处理的数据。
确认 HTTPS、origin、RP ID、固定 secret、callback 白名单、关闭公开注册、持久化数据库、备份和日志保留策略。任何为了“方便测试”而跳过 challenge、origin、state 或 client 校验的改动都不应进入生产。