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

E-mail a heslá

Jednorazové tajomstvá

Odkazy sú 64-znakové URL-safe tokeny; kódy majú 6 až 8 číslic a sú viazané na jednu adresu. Oboje sa ukladá len ako HMAC s kľúčom, platí len najnovšie tajomstvo daného účelu a otvorená podoba existuje iba v notifikácii.

ÚčelKľúč platnostiDruh
magic_linkmagic_link.ttlodkaz
email_otpemail_otp.ttl, .length, .max_attemptskód
reauthenticationzdieľa email_otp.*kód
email_verificationverification.ttl, .code_length, .max_attemptsodkaz alebo kód
password_resetpasswords.reset.ttlodkaz
email_changeemail_change.ttlodkaz

Overenie e-mailu

  • off — nič sa neposiela.
  • optional — overenie sa pošle, no nevynucuje.
  • required_for_actions — prihlásenie je povolené; middleware authentication.verified chráni vaše routy a claim email_verified umožní iným službám kontrolu aj bez spojenia.
  • required_for_login — email_not_verified po overenom prvom faktore.
'verification' => [
    'mode' => env('AUTHENTICATION_VERIFICATION', 'optional'), // off|optional|required_for_actions|required_for_login
    'channel' => 'link',                 // link|code
    'ttl' => 86_400,
    'code_length' => 6,
    'max_attempts' => 5,
    'resend_decay' => 60,
    'verify_on_email_login' => true,
],

'email_change' => [
    'enabled' => true,
    'ttl' => 3_600,
    'notify_old' => true,
    'require_reauthentication' => true,  // false switches the gate off; else reauthentication.required_for decides (change_email)
],

Kanálom je odkaz (URL s fragmentom) alebo kód overený cez token a email. Opätovné odoslanie je verejný endpoint, ktorý vždy odpovie 202, s limitmi e-mailových žiadostí a pauzou resend_decay pre účet. Overenie nevydá nové tokeny: zavolajte refresh, aby sa email_verified dostal do prístupového tokenu.

Zmena e-mailu

use RoundlyConsulting\Auth\DataTransferObjects\EmailChangeData;
use RoundlyConsulting\Auth\Facades\Authentication;

$email = Authentication::guard('users')->email();

$email->sendVerification($user);                 // no-op for verified accounts

// Mails a confirmation link to the NEW address and a heads-up to the old one
$email->requestChange($user, new EmailChangeData('[email protected]', $context));
$email->confirmChange($token, $context);         // from the link — returns the account

Žiadosť vyžaduje nedávne opätovné overenie (kým je change_email chránené), pošle potvrdzovací odkaz na novú adresu a — pri notify_old — upozorní starú. Už použitá adresa dostane e-mail o existujúcom účte a odpoveď je rovnaká 202. Potvrdenie zapíše a overí novú adresu, zneplatní všetky nevyužité tajomstvá, použije invalidation.email_changed, pošle e-mail na starú adresu a spustí EmailChanged.

Pravidlá hesiel

'passwords' => [
    'reset' => ['enabled' => true, 'ttl' => 3_600, 'login_after' => false],
    'change' => ['enabled' => true],
    'rehash_on_login' => true,
    'policy' => [
        'min' => 10,
        'max' => 128,                    // bytes capped at 72 automatically under bcrypt
        'letters' => false,
        'mixed_case' => false,
        'numbers' => false,
        'symbols' => false,
        'not_identifier' => true,
        'uncompromised' => [
            'enabled' => env('AUTHENTICATION_PASSWORD_BREACH_CHECK', false),
            'threshold' => 0,
            'timeout' => 3,
            'fail_closed' => false,
        ],
    ],
],

Pravidlá používajú Laravel pravidlo Password pre dĺžku a zloženie, pri bcrypt vynucujú limit 72 bajtov, odmietajú heslá s lokálnou časťou e-mailu a uplatňujú sa pri každom nastavení hesla.

Kontrola uniknutých hesiel

Po zapnutí sa heslo zahašuje cez SHA-1 a do range API služby Pwned Passwords sa pošle len 5-znakový prefix, s paddingom a 3-sekundovým timeoutom; počet výskytov nad threshold heslo odmietne. Ak služba nie je dostupná, kontrola sa preskočí — alebo pri fail_closed heslo odmietne validačnou chybou (422) — a v oboch prípadoch spustí BreachedPasswordCheckFailed.

Obnova, zmena a nastavenie

use RoundlyConsulting\Auth\DataTransferObjects\ChangePasswordData;
use RoundlyConsulting\Auth\Enums\InvalidationReason;
use RoundlyConsulting\Auth\Facades\Authentication;

$guard     = Authentication::guard('users');
$passwords = $guard->passwords();

// Check a candidate against the guard's policy (throws a ValidationException)
$passwords->validate($password, $user);
$passwords->rule($email);   // the same policy as a validation rule for your own forms

// Change — the current password is required when the account has one
$tokens = $passwords->change($user, new ChangePasswordData(
    currentPassword: $request->input('current_password'),
    newPassword: $request->input('password'),
    current: $guard->tokenFrom($request),
    context: $guard->contextFrom($request),
));   // the re-issued pair for this device — swap to it

// Set — host/admin, invalidation per the given reason
$passwords->set($user, $temporaryPassword, InvalidationReason::Security);
  • Zabudnuté heslo — obmedzené limitmi; skutočný aktívny účet dostane odkaz na obnovu; odpoveď je vždy 202.
  • Obnova — pravidlá sa overia pred spotrebovaním odkazu; potom hash, overenie adresy, odomknutie (reset_unlocks), invalidácia password_reset (all) a notifikácia. Pri reset.login_after prihlásenie vždy prejde nastaveným druhým faktorom.
  • Zmena — aktuálne heslo je povinné, ak ho účet má; bez neho ide o nastavenie, ktoré vyžaduje nedávne opätovné overenie. Vráti volajúcemu znovu vydaný pár.
  • Nastavenie — pre hostiteľa a administrátorov: pravidlá, hash, invalidácia podľa zadaného dôvodu, udalosť a notifikácia.

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.