Kyle Pope
e8e3f62ff8
Phase 1: Add passkey (WebAuthn/FIDO2) backend
New files:
- models/passkey_credential.py: PasskeyCredential model with indexed credential_id
- alembic 061: Create passkey_credentials table
- services/passkey.py: Challenge token management (itsdangerous + nonce replay
protection) and py_webauthn wrappers for registration/authentication
- routers/passkeys.py: 6 endpoints (register begin/complete, login begin/complete,
list, delete) with full security hardening
Changes:
- config.py: WEBAUTHN_RP_ID, RP_NAME, ORIGIN, CHALLENGE_TTL settings
- main.py: Mount passkey router, add CSRF exemptions for login endpoints
- auth.py: Add has_passkeys to /auth/status response
- nginx.conf: Rate limiting on all passkey endpoints, Permissions-Policy
updated for publickey-credentials-get/create
- requirements.txt: Add webauthn>=2.1.0
Security: password re-entry for registration (V-02), single-use nonce
challenges (V-01), constant-time login/begin (V-03), shared lockout
counter, generic 401 errors, audit logging on all events.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 22:46:00 +08:00
..
2026-02-15 16:13:41 +08:00
2026-02-16 01:31:46 +08:00
2026-02-20 07:37:43 +08:00
2026-02-20 13:15:43 +08:00
2026-02-21 12:11:02 +08:00
2026-02-21 19:07:35 +08:00
2026-02-22 00:37:21 +08:00
2026-02-22 01:33:45 +08:00
2026-02-22 03:22:44 +08:00
2026-02-22 11:58:19 +08:00
2026-02-22 17:34:16 +08:00
2026-02-23 01:20:36 +08:00
2026-02-23 10:55:27 +08:00
2026-02-23 17:04:12 +08:00
2026-02-23 19:59:38 +08:00
2026-02-23 21:24:59 +08:00
2026-02-24 01:02:19 +08:00
2026-02-24 04:07:51 +08:00
2026-02-24 21:10:26 +08:00
2026-02-24 21:10:26 +08:00
2026-02-25 01:04:20 +08:00
2026-02-25 04:04:23 +08:00
2026-02-25 04:34:21 +08:00
2026-02-25 04:18:05 +08:00
2026-02-25 10:03:12 +08:00
2026-02-26 19:19:04 +08:00
2026-02-26 19:06:25 +08:00
2026-02-26 19:06:25 +08:00
2026-02-26 19:06:25 +08:00
2026-02-27 04:49:57 +08:00
2026-02-26 19:06:25 +08:00
2026-02-26 19:06:25 +08:00
2026-02-26 19:06:25 +08:00
2026-02-27 06:06:13 +08:00
2026-02-27 05:41:16 +08:00
2026-02-27 19:20:47 +08:00
2026-02-27 22:40:20 +08:00
2026-03-02 19:21:11 +08:00
2026-03-04 02:10:16 +08:00
2026-03-04 02:10:16 +08:00
2026-03-04 02:10:16 +08:00
2026-03-04 02:10:16 +08:00
2026-03-04 02:10:16 +08:00
2026-03-04 07:17:31 +08:00
2026-03-04 07:34:13 +08:00
2026-03-04 08:37:01 +08:00
2026-03-06 03:22:44 +08:00
2026-03-06 03:22:44 +08:00
2026-03-06 03:22:44 +08:00
2026-03-06 03:22:44 +08:00
2026-03-06 03:22:44 +08:00
2026-03-12 19:00:55 +08:00
2026-03-13 00:08:45 +08:00
2026-03-15 02:47:27 +08:00
2026-03-16 20:27:01 +08:00
2026-03-17 00:59:36 +08:00
2026-03-17 03:30:19 +08:00
2026-03-17 03:18:35 +08:00
2026-03-17 03:18:35 +08:00
2026-03-17 03:54:54 +08:00
2026-03-17 22:46:00 +08:00