Shipped in Phase B: forgot/reset routes, hashed single-use tokens (1h), enumeration-safe requestPasswordReset, sessionsValidAfter revocation, Resend templates, and Playwright happy-path E2E. Remaining audit gaps moved to follow-up backlog items.
Status: done (2026-05-24) · Source: [[Projects/personal-finance-notion/context/audit-2026-05-17-auth|Auth audit 2026-05-17 §C1]]
src/lib/models/passwordResetTokenModel.ts — sha256 hash, TTL, usedAt, indexessrc/lib/actions/passwordReset.ts — requestPasswordReset, resetPassword/forgot-password, /reset-password (src/lib/auth-routes.ts)user.sessionsValidAfter on successful reset (Auth.js JWT)tests/e2e/password-reset.spec.ts — request → reset → old password fails → new password worksrandomBytes(32) hex)usedAtsessionsValidAfter)