Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

2Fa Webauthn Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  1. Adopt as-is — drags in scheb/2fa-bundle and Symfony Security. Feasible for a Symfony shop; a permanent bespoke bridge for a Laravel shop.
  2. Adopt the wrapped dependency — 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.

  • Transitive coupling is now demonstrated, not hypothetical. The prior assessment flagged a thin wrapper over a fast-moving crypto library as "precisely the kind of package that goes stale silently." v3.03 is the counter-case and the confirmation in one: an upstream 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.
  • Breaking-change risk is real but narrow. Ed256/Ed512 are non-standard IDs that collide with official assignments, so legitimate enrolment under them should be near-zero. "Near-zero" is not "zero" — if any enrolled credential stores those IDs, that user is locked out post-upgrade with no migration path.
  • Release hygiene is still weak. The tag is published as 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.
  • Adoption signal unchanged. Still low-star, few dependents, single maintainer. One responsive release does not alter that.
  • Future-dated release still unreconciled. The originally reported 2026-09-15 release date remains unverified, and the v3.03 notes carry no date in the supplied data. Tag history still needs to be read directly before this informs a decision.
  • Security-sensitive surface unchanged. Credential storage, challenge/nonce lifecycle, RP ID/origin validation, user-handle binding. v3.03 touches attestation algorithm policy, which is squarely in that surface.
  • MIT license remains the main mitigant and permits forking.

Key questions. Updated with the v3.03-specific items bolded.

  • Is the target application actually Laravel or Symfony, and is scheb/2fa in scope at all?
  • Which COSE algorithm IDs does v3.03 accept, and do any of our existing enrolled credentials use Ed256/Ed512? What is the remediation — re-enrolment, admin reset, or silent failure?
  • What is the pinned cose-lib version, and what other upstream-driven behaviour changes are queued?
  • Which scheb/2fa and web-auth/webauthn-lib majors are supported, and what is the stated support window?
  • Does the package handle the full ceremony (attestation options, assertion verification, sign-counter regression, revocation), or only provider wiring?
  • What is the recovery path for a lost authenticator?
  • Has anyone performed a security review, and is there a disclosure policy?
  • What does the actual tag history look like, and how does Composer resolve v3.03?

Integration Approach

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.

  1. Spike (1 sprint). Stand up 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.
  2. Abstraction (1 sprint). Introduce TwoFactorMethod, refactor existing TOTP behind it. No user-visible change.
  3. WebAuthn as opt-in second factor for an internal cohort. TOTP and recovery codes remain default and fallback.
  4. Harden. Sign-counter handling, revocation UI, admin-assisted recovery, rate limiting on challenge issuance, audit logging, and an algorithm-allowlist policy documented in our own code so upstream changes cannot silently alter what we accept.
  5. Broaden. GA after a clean release cycle of telemetry.

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.

Operational Impact

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.

  • Silent credential invalidation on algorithm-support changes (new) — v3.03 is the template. Mitigated by storing the algorithm per credential, logging rejected values, and owning the allowlist in our code.
  • Upstream-driven behaviour change (elevated) — 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.
  • Version-resolution surprise (new, low) — v3.03 likely normalizes to 3.3.0; verify constraint behaviour before it lands in a lockfile diff nobody reads.
  • RP ID / origin mismatch — per-environment total ceremony failure. Test in staging with production-shaped domains.
  • Session/challenge binding errors — intermittent failures behind a load balancer without shared session state.
  • Sign-counter regressions — clone detection; ambiguous handling either locks out legitimate users or silently skips the check.
  • Supply-chain exposure — still a low-star, single-maintainer package with crypto responsibility sitting in the login path.
  • Vendor abandonment — mitigated by MIT and the fact that real logic lives upstream.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator