NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Auth for Laravel

Opätovné overenie

Prihlásený účet sa pred citlivými akciami znova preukáže. Potom jeho relácia platí ako nedávno overená počas reauthentication.timeout sekúnd (predvolene 900). Značka je v cache podľa guardu a relácie a zaznamenáva, ako sa relácia preukázala — nielen kedy.

'reauthentication' => [
    'timeout' => 900,
    'methods' => ['password', 'totp', 'recovery_code', 'passkey', 'email_otp'],
    'require_second_factor_when_enrolled' => true,  // 2FA/passkey accounts must reauth with totp|recovery_code|passkey
    'fresh_login_counts' => true,                   // auth_time within timeout satisfies the check
    'required_for' => ['enable_two_factor', 'disable_two_factor', 'regenerate_recovery_codes',
        'register_passkey', 'remove_passkey', 'change_email', 'set_password', 'logout_everywhere'],
],

Dostupné metódy

MetódaPonúkne sa, keď
passwordÚčet má heslo — a pri require_second_factor_when_enrolled nemá TOTP ani passkey.
totp, recovery_code2FA režim nie je off a účet má zapnuté TOTP.
passkeyRežim passkeys nie je off a účet má passkey.
email_otpÚčty bez hesla, bez TOTP aj passkey, s e-mailovou adresou.

Ukradnutá relácia spolu s uniknutým heslom preto nedokáže vypnúť faktor, ktorý účet chráni.

Opätovné overenie

Z PHP podkontext reauthentication() vypíše metódy účtu, potvrdí overenie a stráži váš vlastný kód — ensureRecent() a ensureFor() vyhodia ReauthenticationRequired. sendCode() pošle kód účtu bez hesla a passkeyOptions() spustí passkey ceremoniál:

use RoundlyConsulting\Auth\DataTransferObjects\ReauthenticationData;
use RoundlyConsulting\Auth\Enums\ReauthenticationMethod;
use RoundlyConsulting\Auth\Enums\SensitiveAction;
use RoundlyConsulting\Auth\Facades\Authentication;

$guard   = Authentication::guard('users');
$reauth  = $guard->reauthentication();
$current = $guard->tokenFrom($request);

$reauth->methods($user);                        // what this account may re-authenticate with

$until = $reauth->confirm($user, new ReauthenticationData(
    method: ReauthenticationMethod::Totp,
    current: $current,
    context: $guard->contextFrom($request),
    code: $request->input('code'),
));

// Gate your own sensitive code:
$reauth->ensureRecent($user, $current, seconds: 300);
$reauth->ensureFor(SensitiveAction::ChangeEmail, $user, $current);

Opätovné overenie je obmedzené na reláciu; uzamknutý účet dostane account_locked (423). Cez HTTP: POST reauthenticate s method a heslom, kódom alebo credential odpovie confirmed s confirmed_until; POST reauthenticate/passkey/options spustí passkey ceremoniál; POST reauthenticate/otp pošle kód účtom bez hesla.

reauthentication.methods sa overuje voči faktoru, ktorý sa skutočne zhodoval: záložný kód poslaný ako totp, keď recovery_code nie je povolené, sa odmietne s factor_not_allowed (422), započíta sa ako nesprávny dôkaz a nezanechá značku — kód je však spotrebovaný, preto RecoveryCodeUsed aj tak nastane. Opätovné overenie nikdy nespraví zariadenie známym pre detekciu nových zariadení: stačí naň totiž (možno ukradnutý) prístupový token.

Ochrana vašich rout

Route::delete('/account', DeleteAccount::class)
    ->middleware(['auth:users', 'authentication.guard:users', 'authentication.reauthenticated:300']);

Kontrola prejde, ak čerstvé prihlásenie (auth_time v rámci okna, pri fresh_login_counts) alebo nedávne opätovné overenie spĺňa požiadavku účtu v čase kontroly. Účet, ktorý má teraz TOTP alebo passkey, potrebuje dôkaz druhým faktorom: opätovné overenie cez totp, recovery_code či passkey, alebo prihlásenie, ktorého amr obsahuje mfa alebo hwk. Inak odpovie 403 reauthentication_required so zoznamom dostupných metód.

Citlivé akcie

SensitiveActionChránený endpoint
enable_two_factorPOST two-factor
disable_two_factorDELETE two-factor
regenerate_recovery_codesPOST two-factor/recovery-codes
register_passkeyPOST passkeys/options, POST passkeys
remove_passkeyDELETE passkeys/{passkey}
change_emailPOST email/change — len kým je email_change.require_reauthentication true (ensureFor() sa riadi tým istým prepínačom)
logout_everywherePOST logout/everywhere
set_passwordPUT password pre účet bez hesla

Odstránením položky zrušíte bránu pre danú akciu — pre jeden guard alebo pre všetky. Ide o zoznam, preto zoznam guardu nahradí predvolený zoznam celý:

// config/authentication.php — this guard lets a passwordless account set a first password
// without re-authenticating; everything else stays gated.
'guards' => [
    'users' => [
        'reauthentication' => [
            'required_for' => ['enable_two_factor', 'disable_two_factor', 'regenerate_recovery_codes',
                'register_passkey', 'remove_passkey', 'change_email', 'logout_everywhere'],
        ],
    ],
],

Obmedzenia

  • Okno je časové: každý dôkaz platí timeout sekúnd na relácii, ktorá ho poskytla. Kde na tom záleží, držte ho krátke.
  • Pri require_second_factor_when_enrolled = false splní bránu akýkoľvek zaznamenaný dôkaz bez ohľadu na faktory účtu.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.