# 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

1. **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

2. **Login Flow (Passkey)**:
   - User enters email
   - Server returns WebAuthn assertion challenge
   - Browser signs challenge with passkey
   - Server verifies signature, creates session

3. **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)

4. **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
