Overovanie
Balík vygeneruje overovací token, uloží len jeho hash a expiráciu a spustí udalosť s otvoreným textom, aby ho vaša aplikácia doručila vlastným kanálom — e-mailom, SMS alebo čímkoľvek iným. Balík sám nikdy nič neodosiela. Overovanie obsluhuje Contacts::verification(); metódy modelu requestVerification() a confirmVerification() sú skratky pre tie isté volania:
use RoundlyConsulting\Contacts\Facades\Contacts;
// Generate a token and dispatch ContactVerificationRequested($contact, $plainToken).
$token = Contacts::verification()->request($contact); // or $contact->requestVerification()
// Later, confirm with the token the user supplied.
Contacts::verification()->confirm($contact, $token); // or $contact->confirmVerification($token)
// On success: verified_at is set, token fields cleared, ContactVerified fires.Doručenie tokenu
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Contacts\Events\ContactVerificationRequested;
Event::listen(function (ContactVerificationRequested $event): void {
// $event->contact, $event->plainToken — send your own mail/SMS here.
});Otvorený text je označený #[SensitiveParameter], takže sa nikdy neobjaví v stack trace. Nová požiadavka nahradí predchádzajúci token a verification_token je pri serializácii modelu skrytý.
Potvrdenie
Potvrdenie vyhodí InvalidVerificationToken (nesprávny, chýbajúci alebo zneplatnený token) alebo VerificationExpired (po uplynutí TTL). Obe rozširujú ContactException. VerificationAttemptsExceeded je podtrieda InvalidVerificationToken, preto ju zachyťte ako prvú, ak chcete samostatné hlásenie. Potvrdenie už overeného kontaktu ho vráti nezmenený:
use RoundlyConsulting\Contacts\Exceptions\InvalidVerificationToken;
use RoundlyConsulting\Contacts\Exceptions\VerificationAttemptsExceeded;
use RoundlyConsulting\Contacts\Exceptions\VerificationExpired;
use RoundlyConsulting\Contacts\Facades\Contacts;
try {
Contacts::verification()->confirm($contact, $request->string('code')->toString());
} catch (VerificationAttemptsExceeded) {
// the last attempt is spent and the code is void — catch it before its parent
return back()->withErrors(['code' => 'Too many wrong codes. Request a new one.']);
} catch (InvalidVerificationToken) {
return back()->withErrors(['code' => 'That code is not valid.']);
} catch (VerificationExpired) {
return back()->withErrors(['code' => 'That code has expired. Request a new one.']);
}Limit pokusov
Každý token prežije verification.max_attempts (predvolene 5) nesprávnych pokusov. Pokus, ktorý minie posledný, token zneplatní a vyhodí VerificationAttemptsExceeded — vtedy si vyžiadajte nový token. Počet sa ukladá v databáze, takže paralelné požiadavky zdieľajú jeden limit, a token po expirácii pokus nemíňa. Nové request() začne s novým limitom, preto obmedzte, ako často môže používateľ token žiadať — dobre poslúži RateLimiter z Laravelu.
Overenie patrí jednej hodnote
Zmena hodnoty alebo druhu kontaktu — cez update(), sync() alebo priamy $contact->update([...]) — vymaže verified_at a zneplatní čakajúci token, takže token poslaný na starú adresu nikdy nepotvrdí novú. Zápis, ktorý sám nastaví verified_at, napríklad import, sa zachová:
use RoundlyConsulting\Contacts\DataTransferObjects\ContactData;
use RoundlyConsulting\Contacts\Enums\ContactType;
use RoundlyConsulting\Contacts\Facades\Contacts;
$contact->isVerified(); // true
$updated = Contacts::update($contact, new ContactData(ContactType::Email, '[email protected]'));
$updated->isVerified(); // false — and any pending token is void
$contact->update(['value' => '[email protected]']); // a direct write drops it tooKód alebo token
Pri štýle code (predvolený) dostanete číselný kód s code_length číslicami (1 – 72), generovaný číslicu po číslici, takže môže začínať nulou. Pri štýle token dostanete token_length náhodných bajtov (1 – 36) v hex kódovaní — bcrypt číta len prvých 72 znakov, preto dlhšie nastavenie vyhodí výnimku namiesto čiastočnej kontroly:
CONTACTS_VERIFICATION_STYLE=token # 'code' (digits) or 'token' (hex)
CONTACTS_VERIFICATION_TTL=15 # minutes
CONTACTS_VERIFICATION_TOKEN_LENGTH=32 # bytes -> a 64-character hex string (1-36)
CONTACTS_VERIFICATION_MAX_ATTEMPTS=5 # wrong guesses before the token is voidedPriame označenie ako overený
Ak je vlastníctvo už preukázané inak — e-mail z OAuth, kontrola administrátorom — tokenový postup preskočte:
Contacts::verification()->markVerified($contact); // now (idempotent)
Contacts::verification()->markVerified($contact, now()->subDay()); // ...or at a given moment
$contact->isVerified(); // true
Contact::query()->verified()->get(); // verified contacts
Contact::query()->verified(false)->get(); // unverified contacts
Contact::query()->pendingVerification()->get(); // unverified, token issuedFactory obsahuje stav pendingVerification() zodpovedajúci scopu pendingVerification() — pozrite Testovanie.
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 kryptomienOdoslaní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.