CredentialsController::login() and login2fa() are
now rate-limited (5 attempts / 15 min per IP+email) before the manual password/TOTP
checks. Previously the rate limiter was only reached after a successful password, leaving
password and TOTP brute-force unbounded.callbackUrl against the trusted frontend origin before
embedding it in the emailed link (returns 400 on a foreign host).DoctrineSessionRepository stores sha256(token) and
looks up by hash. A DB read no longer yields usable session tokens.DoctrineTotpRepository encrypts the TOTP seed with
AES-256-GCM, keyed from %better_auth.secret%.replaced_by hashed for consistency (no raw replacement token stored).cookie_secure / cookie_http_only / cookie_same_site
are now part of the configuration tree (the recipe shipped them but they were undeclared,
which could break boot or silently drop them). Secure defaults: true / true / lax.refresh_token
(it is now null — session mode has no separate rotatable credential).ke***[@domain](https://github.com/domain)) to avoid leaking PII into centralized logs.QueryParameterTokenExtractor documentation strengthened; it remains off by default
(not part of the default ChainTokenExtractor).composer update):
enc:v1: marker distinguishes encrypted from legacy values).composer install hook is intentionally not used: dependency composer
scripts do not run in the consumer project, and auto-running DB migrations at build time
would break CI. The self-migrating repositories achieve the same result safely.BETTER_AUTH_SECRET stable — rotating it makes already-encrypted TOTP secrets
unreadable.How can I help you explore Laravel packages today?