EVO Dialed uses Better Auth for authentication, with the Rails backend validating JWT tokens.
Authentication flow
Better Auth
Better Auth handles:
- Magic link email login
- Password authentication
- Google OAuth
- Apple Sign-In
- Session management
- JWT token issuance
Sign-in methods
User sync
When a user authenticates, Better Auth syncs to Rails via:
JWT validation
The Rails backend validates JWT tokens in requests.
JwtAuthenticatable concern
File: app/controllers/concerns/jwt_authenticatable.rb
User types
Requiring admin access
User identity
Critical: user_id across ~46 tables is a Better Auth ID (string, 64 chars), NOT users.id. Always join via users.auth_user_id.
Correct joins
Foreign key pattern
Tables reference users via Better Auth ID:
iOS authentication
The iOS app uses cookies and tokens:
Token refresh
- Tokens cached in
TokenStore (UserDefaults)
- Auto-refresh when token expires (60s margin)
- 401 responses trigger forced refresh + retry
Session security
Cookie configuration
Better Auth sessions use secure cookies:
HttpOnly - Not accessible to JavaScript
Secure - HTTPS only in production
SameSite=Lax - CSRF protection
Token expiration
- Access tokens: Short-lived (1 hour)
- Refresh tokens: Long-lived (30 days)
- Session: Extended on activity
Error handling
Testing authentication