Summary
Implement magic link authentication as a passwordless alternative.
Background
Schema already supports magic_link type in verificationTokens. Need service + routes.
New Files
packages/lib/src/auth/magic-link-service.ts
apps/web/src/app/api/auth/magic-link/send/route.ts
apps/web/src/app/api/auth/magic-link/verify/route.ts
Flow
- User enters email → rate-limited token generation
- Email sent with
ps_magic_* token (5-min expiry)
- Click link → validate token → create session → redirect to app
- Token is one-time use (marked
usedAt on consumption)
Technical Details
- Token format:
ps_magic_${randomBytes(32).toString('hex')}
- Rate limiting: 3 requests per email per 15 minutes
- Expiry: 5 minutes
- One-time use enforcement
- Existing user: log in
- New user: create account + log in
Acceptance Criteria
Summary
Implement magic link authentication as a passwordless alternative.
Background
Schema already supports
magic_linktype inverificationTokens. Need service + routes.New Files
packages/lib/src/auth/magic-link-service.tsapps/web/src/app/api/auth/magic-link/send/route.tsapps/web/src/app/api/auth/magic-link/verify/route.tsFlow
ps_magic_*token (5-min expiry)usedAton consumption)Technical Details
ps_magic_${randomBytes(32).toString('hex')}Acceptance Criteria