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

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
algorithmsha1—HMAC haš — sha1, sha256 alebo sha512. Kvôli kompatibilite s autentifikačnými aplikáciami ponechajte sha1.
digits6—Dĺžka kódu, 6–8.
period30—Počet sekúnd jedného časového kroku, 15–120.
window1—Tolerovaný posun hodín v ± časových krokoch, 0–2.
secret_length32—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ť.
issuernullTWO_FACTOR_ISSUERVydavateľ v provisioning URI; null alebo prázdna hodnota prejde na app.name. Hodnota, ktorá nie je reťazcom, vyhodí výnimku.
recovery_codes.count8—Počet záložných kódov vygenerovaných pri aktivácii (aspoň 1).
recovery_codes.storagehashed—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.max5—Počet neúspešných pokusov pred zablokovaním (≥1).
attempts.decay60—Dĺžka zablokovania v sekundách (≥1).
replay_guardcolumn—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.storenullTWO_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.ttl86400—Ako dlho (v sekundách) sa v režime cache uchováva posledný časový krok (aspoň 1).
tableusersTWO_FACTOR_TABLETabuľ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.secrettwo_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_codestwo_factor_recovery_codes—Stĺpec so záložnými kódmi.
columns.confirmed_attwo_factor_confirmed_at—Čas potvrdenia aktivácie.
columns.last_used_timesteptwo_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=users

Kontrola 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-factor

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.