This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Passage is a Swift package providing identity management for Vapor applications. It handles user authentication (register, login, logout), JWT access/refresh tokens, email/phone verification, password reset flows, and federated OAuth login (Google, GitHub, custom providers).
swift build # Build the package
swift test # Run tests (no tests exist yet)-
Passage (
Passage.swift) - Main entry point, configured viaapp.passage.configure(services:configuration:). Registers route collections and jobs. -
User protocol (
User.swift) - Apps implement this to define their user model. Requiresid,email,phone,username,passwordHash,isAnonymous,isEmailVerified,isPhoneVerified. -
Passage.Services (
Passage+Services.swift) - Dependency container holding:Store- protocol with sub-stores (UserStore,TokenStore,CodeStore,ResetCodeStore)EmailDelivery/PhoneDelivery- protocols for sending verification codesRandomGenerator- code/token generationFederatedLoginService- OAuth provider integration
-
Passage.Configuration (
Passage+Configuration.swift) - Extensive configuration for routes, token TTLs, JWT/JWKS, verification/restoration settings, and OAuth providers.
- Register - Creates user with hashed password, auto-sends verification code
- Login - Validates credentials, issues JWT access token + opaque refresh token
- Refresh - Exchanges refresh token for new access/refresh pair (token rotation with family revocation)
- Logout - Revokes refresh token
AccessToken- JWT with standard claims (sub,exp,iat,iss,aud,scope)RefreshToken- Protocol for opaque tokens stored hashed, supports rotation viareplacedBychain
Handles email/phone verification codes. Supports sync delivery or async via Vapor Queues (SendEmailCodeJob, SendPhoneCodeJob).
Password reset flows for email/phone. Similar pattern to verification with queued job support.
Identifier- enum-like struct withKind(.email, .phone, .username) and valueCredential- registration credential pairing identifier with password hash
PassageRouteCollection- Core auth routes (register, login, logout, refresh-token, me)EmailVerificationRouteCollection/PhoneVerificationRouteCollection- Verification endpointsEmailRestorationRouteCollection/PhoneRestorationRouteCollection- Password reset endpointsPasswordResetFormRouteCollection- Web form for password reset (Leaf template)
Resources/EmailTemplates/- HTML email templatesResources/Views/- Leaf templates for web forms
- Protocol-based storage: Apps provide their own
Storeimplementation (e.g., Fluent-backed) - Configurable routes: All route paths are customizable via
Configuration.Routes - Optional queues: Set
useQueues: truein verification/restoration config to dispatch jobs async - JWKS configuration: Load from environment (
JWKS) or file path (JWKS_FILE_PATH)