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

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 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.