Konfigurácia
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ľúč | Env | Predvolené | Účel |
|---|---|---|---|
rp.id | PASSKEYS_RP_ID | host z app.url | ID relying party — registrovateľná doménová prípona každého originu (napr. example.com). |
rp.name | PASSKEYS_RP_NAME | APP_NAME | Čitateľný názov RP, ktorý zobrazí autentifikátor. |
origins | PASSKEYS_ORIGINS | [] | Allowlist presných hodnôt clientData.origin oddelených čiarkou; aspoň jedna je povinná. |
allow_cross_origin | PASSKEYS_ALLOW_CROSS_ORIGIN | false | Akceptovať cross-origin ceremóniu (iframe). |
algorithms | — | ES256, RS256 | Ponúkané a akceptované COSE algoritmy v poradí preferencie. |
timeout_ms | PASSKEYS_TIMEOUT_MS | 60000 | Časový limit ceremónie posielaný prehliadaču, aspoň 1. |
attestation | PASSKEYS_ATTESTATION | none | Preferencia atestácie: none, indirect alebo direct. |
user_verification | — | required | Požiadavka na overenie používateľa: required, preferred alebo discouraged. |
resident_key | PASSKEYS_RESIDENT_KEY | required | Politika objaviteľných kľúčov; required zachová prihlásenie bez mena. |
challenge.store | PASSKEYS_CHALLENGE_STORE | predvolený store | Názov cache store-u pre challenge. |
challenge.ttl | PASSKEYS_CHALLENGE_TTL | 60 | Minimálna platnosť challenge v sekundách, aspoň 1; challenge vždy platí aspoň tak dlho ako časový limit jej ceremónie. |
challenge.bytes | — | 32 | Dĺžka náhodnej challenge v bajtoch, aspoň 16. |
sign_count_policy | — | flag | Pokles počítadla: reject vyhodí výnimku, flag spustí udalosť a pokračuje. |
attestation_trust | PASSKEYS_ATTESTATION_TRUST | ignore | Rebríček dôvery atestácie: ignore, self alebo basic. |
reject_unknown_fmt | PASSKEYS_REJECT_UNKNOWN_FMT | false | Pri ignore odmietne formáty, ktoré balík nevie overiť, a vyhlásenia, ktoré neprejdú overením. |
attestation_anchors.defaults | PASSKEYS_ATTESTATION_DEFAULT_ANCHORS | true | Dô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_skew | PASSKEYS_ATTESTATION_CLOCK_SKEW | 60 | Tolerancia v sekundách (0–3600) na oboch hraniciach platnosti certifikátu. |
aaguids.allowed | PASSKEYS_AAGUIDS_ALLOWED | [] | Allowlist AAGUID oddelených čiarkou; prázdny povolí každý model autentifikátora. |
user.handle_column | PASSKEYS_USER_HANDLE_COLUMN | passkey_user_handle | Stĺpec v hostiteľskej tabuľke s nepriehľadným identifikátorom používateľa. |
user.handle_bytes | — | 32 | Počet náhodných bajtov generovaného identifikátora, 16–64. |
user.name_attribute | — | Atribút modelu použitý ako názov účtu. | |
user.display_name_attribute | — | name | Atribút modelu použitý ako zobrazované meno. |
model | — | Passkey::class | Model kľúča; nasmerujte ho na podtriedu Passkey, ak chcete pridať správanie. Čokoľvek iné vyhodí InvalidConfigurationException. |
table | — | passkeys | Tabuľka kľúčov — nastavte ju pred migráciou (migrácia ju číta). |
key_type | PASSKEYS_KEY_TYPE | bigint | Typ 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=ignorePrepí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=0Striktné 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 aboutPrejavte 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.