jbtronics/2fa-webauthn
Adds WebAuthn-based two-factor authentication to Laravel apps, letting users secure accounts with hardware security keys, passkeys, or built-in biometrics. Includes enrollment, verification, and integration with Laravel's auth scaffolding.
Architecture fit. Unchanged. Despite the framing as a Laravel/PHP package, jbtronics/2fa-webauthn remains a Symfony-first plugin: it implements TwoFactorProviderInterface for scheb/2fa-bundle and delegates all cryptographic work to web-auth/webauthn-lib and cose-lib. v3.03 reinforces this — the change is entirely inside the COSE algorithm allowlist, i.e. the crypto delegation layer, not the provider wiring. The reusable asset is still the pattern plus web-auth/webauthn-lib, not the package's public surface.
Integration feasibility. Unchanged in shape, but v3.03 adds one concrete pre-adoption check. The two paths remain:
scheb/2fa-bundle and Symfony Security. Feasible for a Symfony shop; a permanent bespoke bridge for a Laravel shop.web-auth/webauthn-lib behind a Laravel-native TwoFactorMethod contract. Still the realistic path; this package remains a reference implementation.New caveat for path 1: v3.03 removes Ed256/Ed512 support outright. Any credentials enrolled under those algorithm IDs will now fail assertion verification. Because the maintainer asserts "should not cause any BC issues," an adopting team must verify that claim against its own credential table rather than take it on trust.
Technical risk. Still medium-to-high, but the composition of the risk has shifted slightly.
cose-lib behaviour change (a warning on non-standard COSE algorithm IDs) forced a behavioural change in this package. Good news — the maintainer is tracking upstream and made a correctness-driven removal. Bad news — the package's behaviour is now demonstrably hostage to a third dependency we do not control, and the blast radius lands in the login path.v3.03, not v3.0.3. Composer's version parser casts 03 to 3, so this likely normalizes to 3.3.0 — a minor-version jump, not the patch the changelog implies, and one that will not sort as expected against ^3.0 constraints or lockfile diffing. This is a second instance of the release-metadata carelessness already flagged. Low severity in isolation; a meaningful signal about release discipline for code in the authentication path.Key questions. Updated with the v3.03-specific items bolded.
scheb/2fa in scope at all?cose-lib version, and what other upstream-driven behaviour changes are queued?scheb/2fa and web-auth/webauthn-lib majors are supported, and what is the stated support window?v3.03?Stack fit. Poor as a direct Laravel dependency; good as a specification of intended UX and provider contract. Target shape is unchanged: framework-owned TwoFactorMethod contract with TotpMethod and WebAuthnMethod, the latter built on web-auth/webauthn-lib with our own credential schema (credential ID, public key, COSE algorithm, sign counter, transports), and enrolment/challenge/verification endpoints owned by us. Storing the algorithm per credential is now a hard requirement, not a nicety — it is the only way to detect affected users if an upstream library drops support again.
Migration path. Unchanged for Laravel (greenfield implementation, scoped as such). For a Symfony team already on scheb/2fa, v3.03 is still low-friction provided a pre-upgrade audit confirms no stored Ed256/Ed512 credentials.
Compatibility. Pin exact versions of scheb/2fa, web-auth/webauthn-lib, and now cose-lib — the v3.03 change originated there, so it belongs in the tested matrix. Also re-verify how Composer resolves the v3.03 tag before relying on constraint ranges. WebAuthn's hard external constraints (browser support, RP ID/origin alignment across localhost/staging/production, platform vs. roaming transports) continue to break integration more often than PHP versions do.
Sequencing.
web-auth/webauthn-lib on a throwaway branch, complete registration and assertion end-to-end, read this package as the reference for provider ergonomics. Go/no-go with measured effort.TwoFactorMethod, refactor existing TOTP behind it. No user-visible change.If a Symfony team is upgrading an existing install to v3.03, insert a one-step pre-upgrade audit ahead of sequencing: enumerate distinct COSE algorithm values in the credential table, confirm none are Ed256/Ed512, and identify users requiring re-enrolment. Do that before the upgrade, not after the tickets arrive.
Do not ship WebAuthn as a replacement for TOTP in the first release. Additive only.
Maintenance. Dominant cost is unchanged: owning a security-sensitive code path. v3.03 is a useful data point for that budget — it is a small, sensible, upstream-driven change that nonetheless required a downstream behavioural decision from a solo maintainer. Expect one or two of these per year, each a mandatory review with a real code-reading cost. Keep a named owner. The single-maintainer bus factor stands; MIT means we can fork, which converts "wait for upstream" into "maintain a fork" — not obviously cheaper.
Support. Credential-loss tickets remain the volume driver. v3.03 adds a second, smaller support category: users whose authenticator fails after an algorithm-support change. That is invisible to the user and looks like "my key stopped working" — the worst kind of ticket. Log the rejected algorithm ID on assertion failure so support can distinguish this from genuine device loss in one look.
Scaling. Unchanged and effectively free: local public-key verification, no third-party hop, sub-millisecond CPU, one row per credential. The only scaling concern remains challenge state — assertion challenges must bind to the session or a short-lived server-side record, which is a shared-cache (Redis) dependency in multi-node deployments and produces intermittent, hard-to-reproduce failures when wrong.
Failure modes.
cose-lib / webauthn-lib majors can alter accepted inputs without any change in this package. Pin, test, and treat every bump as a security review.v3.03 likely normalizes to 3.3.0; verify constraint behaviour before it lands in a lockfile diff nobody reads.Ramp-up. Unchanged: low for concepts, moderate for implementation. v3.03 is actually a cheap teaching artifact — a ten-line changelog that shows why the COSE algorithm allowlist matters and why a thin wrapper inherits upstream policy. Worth ten minutes in the spike read-through. The learning cost remains in the edge cases: attestation policy, transport hints, conditional UI, recovery UX.
Recommendation. Unchanged in direction, marginally improved in confidence. Do not take a production dependency on jbtronics/2fa-webauthn for a Laravel product — the low adoption, single maintainer, and still-unverifiable release timeline keep it below the bar for code in the authentication path. But v3.03 is evidence the maintainer is awake and tracking upstream, which is the one thing that could have made this package actively dangerous; record it as a positive signal and re-check at the next release. Use it as a reference implementation for one sprint, build on web-auth/webauthn-lib (pinning cose-lib) behind our own two-factor abstraction so algorithm policy is ours, and revisit only if we standardize on Symfony's scheb/2fa — where this becomes a reasonable convenience layer rather than a load-bearing one.
How can I help you explore Laravel packages today?