componenta / auth-otp
Bound one-time-code authentication challenges for Componenta Auth 3
Requires
- php: ^8.4
- componenta/auth: ^3.0
- componenta/auth-http: ^1.0
- componenta/auth-session: ^1.0
- componenta/auth-session-http: ^2.0.1
- componenta/identity: ^1.0.1
- cycle/database: ^2.22
- psr/clock: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
Requires (Dev)
- componenta/clock: ^1.1.0
- nyholm/psr7: ^1.8
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-10 23:09:51 UTC
README
Generic one-time-code challenges for Componenta Auth 3.
OTP is a proof mechanism, not an email-login package. Purpose and channel are bounded extensible identifiers. Browser login binds the challenge to a short-lived pre-authentication transaction; reauthentication binds it to the current public AuthSession UUID.
Security properties:
- CSPRNG numeric codes: 4-8 digits when explicitly configured, six digits by default; for new deployments prefer six or more and retain bounded abuse limits;
- HMAC-SHA-256 verifier with challenge/purpose domain separation;
- plaintext code is never persisted;
- single-use atomic verification;
- per-challenge attempt limit;
- aggregate subject+purpose failure budget survives resend/new challenge;
- resend cooldown;
- generic public invalid-code denial;
- channel-specific evidence never upgrades itself to MFA/phishing resistance.
Version 2.0.1 compatibility
Version 2.0.0 requires componenta/auth-session-http ^2.0.1. Its browser
security contract uses componenta/http-csrf-middleware ^3.0, which validates
Origin/Referer on unsafe requests and rejects missing origin metadata by
default. Upgrade the session HTTP and CSRF packages together; do not disable
origin validation to preserve older clients.
See the changelog for migration details. Session issuance continues to use the shared Componenta Auth session APIs; this package does not create an independent session or CSRF stack.