Nonce a jednorazové URL
Nonce je jednorazový náhodný token viazaný na účel: kód na obnovu hesla či overenie emailu, jednorazové stiahnutie, krok potvrdenia.
$nonce = Sentinel::nonces()->issue('password-reset', ttl: 900, subject: $user);
$nonce->value; // 43 base64url characters (≈ 256 bits, nonces.length); only its SHA-256 is stored
$nonce->purpose;
$nonce->expiresAt;
Sentinel::nonces()->consume('password-reset', $token, $user); // true exactly once
Sentinel::nonces()->consumeOrFail('password-reset', $token, $user); // NonceRejectedException (403) otherwise- Ukladá sa len SHA-256(value) — výpis databázy nonce prehrať neumožní.
- Účel: ^[a-z0-9][a-z0-9:._-]{0,127}$ (inak InvalidPurposeException — pri vydaní aj pri spotrebovaní).
- TTL: nonces.ttl (900 s), ak nie je zadané; zadané TTL musí byť 1–2 592 000 sekúnd.
- Spotrebovanie je jeden príkaz UPDATE; úspech znamená, že sa zmenil práve jeden riadok. Z ôsmich súbežných pokusov na PostgreSQL aj MySQL uspeje práve jeden.
- Nesprávny účel, iný subjekt, expirovaný, spotrebovaný či neznámy nonce sú pre volajúceho nerozlíšiteľné (false). Nonce vydaný bez subjektu sa spotrebuje bez subjektu.
Jednorazové podpísané URL
$url = Sentinel::nonces()->signedRoute('exports.download', ['export' => $export->id], ttl: 600);
Route::get('/exports/{export}', DownloadExport::class)
->name('exports.download')
->middleware('sentinel.single-use');signedRoute() vydá nonce pre účel url:<route name>, pridá ho ako _nonce a vráti dočasnú podpísanú URL Laravelu. sentinel.single-use najprv vyžaduje platný podpis Laravelu — zmenený alebo expirovaný odkaz sa odmietne skôr, než sa siahne na nonce — a potom nonce pre danú routu spotrebuje. Druhá návšteva alebo nonce presunutý na inú routu odpovie 403 (application/problem+json, nonce_rejected).
Ploché tvary
use RoundlyConsulting\Sentinel\DataTransferObjects\ConsumeNonceRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\IssueNonceRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\PruneOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\SignedRouteRequest;
$nonce = Sentinel::issueNonce(new IssueNonceRequest('password-reset', ttl: 900, subject: $user));
Sentinel::consumeNonce(new ConsumeNonceRequest('password-reset', $nonce->value, $user));
$url = Sentinel::signedRoute(new SignedRouteRequest('exports.download', ['export' => $export->id], ttl: 600));
$pruned = Sentinel::prune(new PruneOptions(idempotency: true, nonces: true, dryRun: true)); // counts onlyÚložiská a čistenie
database (predvolené) používa sentinel_nonces na sentinel.database.connection; cache vyžaduje store so zámkami; pre vlastné úložisko naviažte Contracts\NonceStore. Overovač RFC 9421 si v tom istom úložisku pamätá nonce každého podpisu — až po úspešnom overení podpisu, takže neautentifikovaná prevádzka ho nezahltí. sentinel:prune (plánovaný denne) zmaže expirované nonce aj idempotenčné kľúče:
use RoundlyConsulting\Sentinel\DataTransferObjects\PruneOptions;
$result = Sentinel::prune(); // both, PruneResult
$result = Sentinel::prune(new PruneOptions(idempotency: false, nonces: true, dryRun: true));
$result->idempotencyKeys; // deleted (or, on a dry run, would be deleted)
$result->nonces;Úložiská cache nechajú záznamy expirovať samy a hlásia 0. Idempotenčný kľúč, ktorý stále drží živý lease, sa nikdy nezmaže.
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.