Konfigurácia
Publikovaný config/two-factor.php v plnom znení. Predvolené hodnoty TOTP zodpovedajú bežným autentifikačným aplikáciám (RFC 6238):
use RoundlyConsulting\Crypto\Otp\OtpAlgorithm;
use RoundlyConsulting\TwoFactor\Enums\RecoveryCodeStorage;
use RoundlyConsulting\TwoFactor\Enums\ReplayGuardMode;
return [
// TOTP parameters — defaults match standard authenticator apps (RFC 6238).
// Bounds are enforced at runtime; out-of-range or non-integer values (e.g.
// 'five') throw InvalidTwoFactorConfigException rather than silently weakening 2FA.
'algorithm' => OtpAlgorithm::Sha1->value, // 'sha1' | 'sha256' | 'sha512'
'digits' => 6, // 6–8
'period' => 30, // 15–120 seconds per timestep
'window' => 1, // 0–2: accept ±N timesteps of drift
'secret_length' => 32, // base32 chars (16–4096); 32 = 160 bits; 1/3/6 (mod 8) round up by one
// Provisioning (otpauth:// URI). issuer falls back to config('app.name') at runtime.
'issuer' => env('TWO_FACTOR_ISSUER'), // null/blank → app.name
'recovery_codes' => [
'count' => 8,
'storage' => RecoveryCodeStorage::Hashed->value, // 'hashed' (default) | 'encrypted'
],
// Built-in brute-force limiter for attempt(), keyed per user. Set to null
// to disable it and rely on your own throttle middleware instead.
'attempts' => [
'max' => 5, // failed attempts before lockout
'decay' => 60, // seconds the lockout lasts
],
// Replay protection: reject any code whose timestep <= the last successful one.
'replay_guard' => ReplayGuardMode::Column->value, // 'column' | 'cache' | 'none' (null → none; blank → column)
'cache' => [
'store' => env('TWO_FACTOR_CACHE_STORE'), // null/blank → default store (used by cache guard)
'ttl' => 60 * 60 * 24, // seconds to retain last timestep in cache mode
],
// The table the published migration adds the columns to. Other account
// tables get them via `$table->twoFactorColumns()` in your own migration.
'table' => env('TWO_FACTOR_TABLE', 'users'),
// Column names on the host account table(s) — remap for non-standard schemas.
'columns' => [
'secret' => 'two_factor_secret',
'recovery_codes' => 'two_factor_recovery_codes',
'confirmed_at' => 'two_factor_confirmed_at',
'last_used_timestep' => 'two_factor_last_used_timestep',
],
];Všetky kľúče
| Kľúč | Predvolené | Env | Účel |
|---|---|---|---|
algorithm | sha1 | — | HMAC haš — sha1, sha256 alebo sha512. Kvôli kompatibilite s autentifikačnými aplikáciami ponechajte sha1. |
digits | 6 | — | Dĺžka kódu, 6–8. |
period | 30 | — | Počet sekúnd jedného časového kroku, 15–120. |
window | 1 | — | Tolerovaný posun hodín v ± časových krokoch, 0–2. |
secret_length | 32 | — | Dĺžka base32 tajného kľúča, 16–4096 znakov; 32 znakov = 160 bitov. Dĺžka, ktorú base32 reťazec mať nemôže (1, 3 alebo 6 mod 8, napr. 17 či 30), sa zaokrúhli o jeden znak nahor, takže kľúč sa vždy dá dekódovať. |
issuer | null | TWO_FACTOR_ISSUER | Vydavateľ v provisioning URI; null alebo prázdna hodnota prejde na app.name. Hodnota, ktorá nie je reťazcom, vyhodí výnimku. |
recovery_codes.count | 8 | — | Počet záložných kódov vygenerovaných pri aktivácii (aspoň 1). |
recovery_codes.storage | hashed | — | hashed (jednosmerne) alebo encrypted (vratne, dajú sa zobraziť znova). |
attempts | ['max' => 5, 'decay' => 60] | — | Vstavané obmedzenie pokusov pre každý účet; vypne ho len null — false, 'off' či 0 vyhodí výnimku a prázdna hodnota ponechá dodané limity. |
attempts.max | 5 | — | Počet neúspešných pokusov pred zablokovaním (≥1). |
attempts.decay | 60 | — | Dĺžka zablokovania v sekundách (≥1). |
replay_guard | column | — | Kde sa ukladá posledný použitý časový krok: column, cache, alebo none/null na vypnutie. Prázdna hodnota sa považuje za nenastavenú a ponechá column. Len reťazce — false či 0 vyhodí výnimku. |
cache.store | null | TWO_FACTOR_CACHE_STORE | Úložisko cache pre cache guard; null alebo prázdna hodnota = predvolené úložisko. Hodnota, ktorá nie je reťazcom, vyhodí výnimku. |
cache.ttl | 86400 | — | Ako dlho (v sekundách) sa v režime cache uchováva posledný časový krok (aspoň 1). |
table | users | TWO_FACTOR_TABLE | Tabuľka, ktorú upraví publikovaná migrácia; ak nie je nastavená (chýba, null alebo prázdna hodnota), users. Hodnota, ktorá nie je reťazcom, vyhodí výnimku. |
columns.secret | two_factor_secret | — | Stĺpec so šifrovaným tajným kľúčom. Prázdny názov columns.* sa považuje za nenastavený a dostane predvolenú hodnotu; názov, ktorý nie je reťazcom, vyhodí výnimku. |
columns.recovery_codes | two_factor_recovery_codes | — | Stĺpec so záložnými kódmi. |
columns.confirmed_at | two_factor_confirmed_at | — | Čas potvrdenia aktivácie. |
columns.last_used_timestep | two_factor_last_used_timestep | — | Posledný použitý časový krok pre replay guard column. |
Hranice sa vynucujú
digits (6–8), period (15–120), window (0–2), secret_length (16–4096) a attempts.max / attempts.decay (aspoň 1) sa kontrolujú za behu. Hodnota mimo rozsahu — alebo hodnota, ktorá vôbec nie je celým číslom, či neznámy algorithm, recovery_codes.storage alebo replay_guard — vyhodí InvalidTwoFactorConfigException namiesto tichého oslabenia 2FA.
Striktné čítanie
Každé nastavenie sa číta striktne. Nenastavený kľúč — chýbajúci, null alebo prázdny ('' či len medzery, čo dá riadok KEY= v .env) — dostane predvolenú hodnotu uvedenú vyššie; zadaná hodnota nesprávneho tvaru vyhodí InvalidTwoFactorConfigException s názvom kľúča. Celé čísla prijímajú int alebo kanonický celočíselný reťazec ('30', v takej podobe prichádzajú hodnoty z env), takže 'five' či '1.5' vyhodí výnimku namiesto toho, aby sa z nich stala 0 — nezmyselné window teda nikdy potichu nevypne toleranciu posunu. attempts vypne len null; false, 'off' či 0 vyhodí výnimku a prázdna hodnota ponechá dodané limity. replay_guard vypne len null alebo none; prázdna hodnota ponechá guard column. issuer, ktorý nie je reťazcom, vyhodí výnimku (prázdny sa považuje za nenastavený, takže platí app.name) a rovnako aj názov tabuľky či stĺpca, ktorý nie je reťazcom — prázdny dostane predvolenú hodnotu.
Enumy v pozadí
Textové hodnoty sú podložené enumami, takže neznáma hodnota zlyhá hneď pri načítaní — nikdy nedôjde k tichému zníženiu sily hašu:
use RoundlyConsulting\Crypto\Otp\OtpAlgorithm; // Sha1, Sha256, Sha512 — backs `algorithm`
use RoundlyConsulting\TwoFactor\Enums\RecoveryCodeStorage; // Encrypted, Hashed; cast(); ::fromConfig()
use RoundlyConsulting\TwoFactor\Enums\ReplayGuardMode; // Column, Cache, None; ::fromConfig() (null → None)
use RoundlyConsulting\TwoFactor\Enums\TwoFactorMethod; // Totp ('totp'), RecoveryCode ('recovery_code')Prostredie (env)
Tri kľúče sa čítajú z premenných prostredia:
TWO_FACTOR_ISSUER="Acme"
TWO_FACTOR_CACHE_STORE=redis
TWO_FACTOR_TABLE=usersKontrola konfigurácie
Balík pridáva sekciu do php artisan about. Zobrazí algoritmus, dĺžku a periódu kódu, toleranciu posunu, dĺžku tajného kľúča, či je nastavený vydavateľ, počet a režim ukladania záložných kódov, replay guard, limit pokusov a či je mapa stĺpcov predvolená alebo upravená — nikdy nie tajný kľúč, záložný kód, samotného vydavateľa ani názov úložiska cache:
php artisan about --only=two-factorPrejavte 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.