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

config/passkeys.php popisuje každú možnosť. Pri štarte aplikácie sa načíta do typovaného objektu PasskeyConfig a zvaliduje, takže chybná konfigurácia zlyhá hneď vtedy, nie až pri prvej registrácii. Bezpečnostne kritické sú rp.id a origins — nedajú sa bezpečne predvoliť a bez nich sa ceremónia nespustí. Publikovaný súbor bez blokových komentárov:

use RoundlyConsulting\Crypto\Cose\CoseAlgorithm;
use RoundlyConsulting\Passkeys\Enums\AttestationConveyance;
use RoundlyConsulting\Passkeys\Enums\AttestationTrust;
use RoundlyConsulting\Passkeys\Enums\ResidentKey;
use RoundlyConsulting\Passkeys\Enums\SignCountPolicy;
use RoundlyConsulting\Passkeys\Enums\UserVerification;
use RoundlyConsulting\Passkeys\Models\Passkey;

return [
    'rp' => [
        'id' => env('PASSKEYS_RP_ID'),
        'name' => env('PASSKEYS_RP_NAME', env('APP_NAME', 'Laravel')),
    ],

    'origins' => array_values(array_filter(
        explode(',', (string) env('PASSKEYS_ORIGINS', '')),
    )),
    'allow_cross_origin' => env('PASSKEYS_ALLOW_CROSS_ORIGIN', false),

    'algorithms' => [
        CoseAlgorithm::ES256->value,   // -7
        CoseAlgorithm::RS256->value,   // -257
        // CoseAlgorithm::EdDSA->value, // -8 (requires ext-sodium)
    ],

    'timeout_ms' => env('PASSKEYS_TIMEOUT_MS', 60_000),
    'attestation' => env('PASSKEYS_ATTESTATION', AttestationConveyance::None->value),
    'user_verification' => UserVerification::Required->value,
    'resident_key' => env('PASSKEYS_RESIDENT_KEY', ResidentKey::Required->value),

    'challenge' => [
        'store' => env('PASSKEYS_CHALLENGE_STORE'),
        'ttl' => env('PASSKEYS_CHALLENGE_TTL', 60),
        'bytes' => 32,
    ],

    'sign_count_policy' => SignCountPolicy::Flag->value,

    'attestation_trust' => env('PASSKEYS_ATTESTATION_TRUST', AttestationTrust::Ignore->value),
    'reject_unknown_fmt' => env('PASSKEYS_REJECT_UNKNOWN_FMT', false),
    'attestation_anchors' => [
        'defaults' => env('PASSKEYS_ATTESTATION_DEFAULT_ANCHORS', true),
        'paths' => [
            // 'packed' => [storage_path('webauthn/vendor-fido-ca.pem')],
        ],
    ],
    'attestation_clock_skew' => env('PASSKEYS_ATTESTATION_CLOCK_SKEW', 60),
    'aaguids' => [
        'allowed' => array_values(array_filter(
            explode(',', (string) env('PASSKEYS_AAGUIDS_ALLOWED', '')),
        )),
    ],

    'user' => [
        'handle_column' => env('PASSKEYS_USER_HANDLE_COLUMN', 'passkey_user_handle'),
        'handle_bytes' => 32,
        'name_attribute' => 'email',
        'display_name_attribute' => 'name',
    ],

    'model' => Passkey::class,
    'table' => 'passkeys',
    'key_type' => env('PASSKEYS_KEY_TYPE', 'bigint'),
];

Všetky kľúče

KľúčEnvPredvolenéÚčel
rp.idPASSKEYS_RP_IDhost z app.urlID relying party — registrovateľná doménová prípona každého originu (napr. example.com).
rp.namePASSKEYS_RP_NAMEAPP_NAMEČitateľný názov RP, ktorý zobrazí autentifikátor.
originsPASSKEYS_ORIGINS[]Allowlist presných hodnôt clientData.origin oddelených čiarkou; aspoň jedna je povinná.
allow_cross_originPASSKEYS_ALLOW_CROSS_ORIGINfalseAkceptovať cross-origin ceremóniu (iframe).
algorithms—ES256, RS256Ponúkané a akceptované COSE algoritmy v poradí preferencie.
timeout_msPASSKEYS_TIMEOUT_MS60000Časový limit ceremónie posielaný prehliadaču, aspoň 1.
attestationPASSKEYS_ATTESTATIONnonePreferencia atestácie: none, indirect alebo direct.
user_verification—requiredPožiadavka na overenie používateľa: required, preferred alebo discouraged.
resident_keyPASSKEYS_RESIDENT_KEYrequiredPolitika objaviteľných kľúčov; required zachová prihlásenie bez mena.
challenge.storePASSKEYS_CHALLENGE_STOREpredvolený storeNázov cache store-u pre challenge.
challenge.ttlPASSKEYS_CHALLENGE_TTL60Minimálna platnosť challenge v sekundách, aspoň 1; challenge vždy platí aspoň tak dlho ako časový limit jej ceremónie.
challenge.bytes—32Dĺžka náhodnej challenge v bajtoch, aspoň 16.
sign_count_policy—flagPokles počítadla: reject vyhodí výnimku, flag spustí udalosť a pokračuje.
attestation_trustPASSKEYS_ATTESTATION_TRUSTignoreRebríček dôvery atestácie: ignore, self alebo basic.
reject_unknown_fmtPASSKEYS_REJECT_UNKNOWN_FMTfalsePri ignore odmietne formáty, ktoré balík nevie overiť, a vyhlásenia, ktoré neprejdú overením.
attestation_anchors.defaultsPASSKEYS_ATTESTATION_DEFAULT_ANCHORStrueDôverovať pribaleným koreňom Apple WebAuthn a Google hardware attestation.
attestation_anchors.paths—[]format => [absolútne cesty k PEM] — vaše vlastné kotvy dôvery.
attestation_clock_skewPASSKEYS_ATTESTATION_CLOCK_SKEW60Tolerancia v sekundách (0–3600) na oboch hraniciach platnosti certifikátu.
aaguids.allowedPASSKEYS_AAGUIDS_ALLOWED[]Allowlist AAGUID oddelených čiarkou; prázdny povolí každý model autentifikátora.
user.handle_columnPASSKEYS_USER_HANDLE_COLUMNpasskey_user_handleStĺpec v hostiteľskej tabuľke s nepriehľadným identifikátorom používateľa.
user.handle_bytes—32Počet náhodných bajtov generovaného identifikátora, 16–64.
user.name_attribute—emailAtribút modelu použitý ako názov účtu.
user.display_name_attribute—nameAtribút modelu použitý ako zobrazované meno.
model—Passkey::classModel kľúča; nasmerujte ho na podtriedu Passkey, ak chcete pridať správanie. Čokoľvek iné vyhodí InvalidConfigurationException.
table—passkeysTabuľka kľúčov — nastavte ju pred migráciou (migrácia ju číta).
key_typePASSKEYS_KEY_TYPEbigintTyp kľúča vlastníka v morph stĺpci: bigint, uuid alebo ulid (na veľkosti písmen nezáleží; nenastavená alebo prázdna hodnota znamená bigint, čokoľvek iné vyhodí InvalidConfigurationException) — nastavte pred migráciou.

Prostredie (env)

Bežné nastavenia idú cez env, takže väčšina aplikácií konfiguráciu vôbec nepublikuje:

PASSKEYS_RP_ID=example.com
PASSKEYS_RP_NAME="Example"
PASSKEYS_ORIGINS=https://example.com,https://www.example.com
PASSKEYS_TIMEOUT_MS=60000
PASSKEYS_CHALLENGE_TTL=60
PASSKEYS_ATTESTATION=none
PASSKEYS_ATTESTATION_TRUST=ignore

Prepínače áno/nie

Tri prepínače — allow_cross_origin, reject_unknown_fmt a attestation_anchors.defaults — prijímajú bežné zápisy v env: true/false, 1/0, on/off a yes/no. Nenastavená hodnota — chýbajúca, null alebo prázdna ('', čo dáva KEY= v .env) — znamená predvolenú hodnotu z tabuľky; čokoľvek iné (preklep ako disabled) vyhodí InvalidConfiguration s názvom kľúča, namiesto toho, aby sa potichu prečítalo ako predvolená hodnota:

PASSKEYS_ALLOW_CROSS_ORIGIN=off
PASSKEYS_REJECT_UNKNOWN_FMT=yes
PASSKEYS_ATTESTATION_DEFAULT_ANCHORS=0

Striktné hodnoty

Rovnako striktné sú aj všetky ostatné kľúče. Nenastavená hodnota (chýbajúca, null alebo prázdna) znamená predvolenú; prítomná hodnota nesprávneho tvaru vyhodí InvalidConfiguration s názvom kľúča:

  • Celé čísla — timeout_ms ≥ 1, challenge.ttl ≥ 1, challenge.bytes ≥ 16, user.handle_bytes 16–64, attestation_clock_skew 0–3600 — prijímajú int alebo kanonický celočíselný reťazec, takže „five“, „1.5“ či „1e3“ vyhodí výnimku, namiesto toho, aby sa zmenilo na 0 alebo orezalo do rozsahu.
  • Enum kľúče — attestation, attestation_trust, user_verification, resident_key a sign_count_policy — prijímajú prípad enumu alebo jeho presnú hodnotu; preklep vyhodí výnimku a nikdy sa neprečíta ako predvolená hodnota.
  • origins, aaguids.allowed, algorithms a attestation_anchors.paths musia byť zoznamy platných položiek; hodnota, ktorá nie je zoznamom, či chybná položka vyhodí výnimku, namiesto toho, aby sa vynechala. Prázdny zoznam algorithms vyhodí výnimku tiež — pre predvolené hodnoty kľúč nenastavujte alebo ho nechajte prázdny.
  • Reťazcové kľúče — rp.name, stĺpec a atribúty v user.* a table — musia byť reťazce a prázdny sa považuje za nenastavený, takže platí jeho predvolená hodnota (rp.name → APP_NAME); rp.id a challenge.store musia byť reťazcami, ak sú nastavené (prázdna hodnota znamená nenastavené, takže rp.id sa odvodí z app.url a challenge použijú predvolený store).

Včasná validácia

  • Ceremónia bez rp.id alebo bez originov vyhodí InvalidConfiguration (missingRpId / emptyOrigins).
  • S predvolenou konfiguráciou aplikácia vždy naštartuje — na ceremóniu čakajú len rp.id a origins. Nasledujúce kontroly prebehnú pri štarte aplikácie.
  • COSE algoritmus mimo ES256, RS256 a EdDSA vyhodí InvalidConfiguration už pri štarte.
  • attestation_trust prísnejší ako ignore pri attestation none zlyhá pri štarte — inak by sa každá registrácia odmietla z dôvodu, ktorý nikto nevidí.
  • attestation_clock_skew mimo 0–3600 zlyhá pri štarte; nečitateľná cesta ku kotve dôvery alebo súbor bez PEM vyhodí výnimku pri prvom použití.
  • challenge.bytes pod 16 alebo user.handle_bytes mimo 16–64 vyhodí InvalidConfiguration pri štarte, namiesto toho, aby sa hodnota orezala.

Kontrola nastavenia

Balík pridáva vlastnú sekciu do php artisan about. Ukáže bezpečnostné nastavenie — stupeň dôvery, preferenciu atestácie, požiadavky na overenie, počty, TTL a prítomnosť hodnôt (SET/MISSING) — no nikdy samotné RP ID, originy, cesty ku kotvám ani AAGUID:

php artisan about

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.