2.6 KiB
2.6 KiB
ADR-004: Authentication Strategy
Status
Accepted
Context
The platform needs secure authentication for both technical and non-technical users. Requirements include: primary passkey support, password fallback, session management, and resistance to common attacks (phishing, credential stuffing, session hijacking).
Decision
Passkeys as primary authentication method, Argon2id-hashed passwords as fallback.
Implementation
-
Registration Flow:
- User provides email
- System generates WebAuthn registration challenge
- Browser creates passkey ( Touch ID, Windows Hello, YubiKey)
- Server stores credential ID and public key
- Optional: user sets password fallback
-
Login Flow (Passkey):
- User enters email
- Server returns WebAuthn assertion challenge
- Browser signs challenge with passkey
- Server verifies signature, creates session
-
Login Flow (Password):
- User enters email + password
- Server verifies Argon2id hash (constant-time comparison)
- If valid, creates session
- Prompts to set up passkey (progressive enhancement)
-
Session Management:
- Signed cookies with 24-hour expiry
- Refresh tokens rotate on each use
- Sessions stored in database (revocable)
- HttpOnly, Secure, SameSite=Strict flags
Consequences
Positive
- Passkeys are phishing-resistant by design
- No password database to breach (if passkey-only)
- Argon2id is winner of Password Hashing Competition
- Session tokens are revocable server-side
- Progressive enhancement: passkey users never type passwords
Negative
- Passkey support varies by browser/OS
- Users may lose access if they lose all devices (recovery flow needed)
- WebAuthn implementation complexity (mitigated by go-webauthn library)
- Backup codes or recovery email needed for account recovery
Alternatives Considered
OAuth 2.0 / SSO Only
- Pros: No password management, familiar UX
- Cons: Vendor lock-in to identity providers, privacy concerns, not self-hosted
- Rejected: Violates "no vendor lock-in" principle
Passwords Only (with 2FA)
- Pros: Simple, universally supported
- Cons: Vulnerable to phishing, credential stuffing, SIM swapping
- Rejected: Passkeys are strictly superior
Magic Links
- Pros: No passwords, simple UX
- Cons: Email dependency, slower, inbox security issues
- Rejected: Less secure than passkeys, poor for frequent login
References
- WebAuthn spec: https://www.w3.org/TR/webauthn-2/
- go-webauthn library: https://github.com/go-webauthn/webauthn
- Argon2id RFC: https://datatracker.ietf.org/doc/html/rfc9106