headerx/laravel-jetstream-passport
Integrates Laravel Passport with Jetstream to add OAuth2 API token management to your Inertia/Vue app. Provides ready-made UI for creating, viewing, and revoking personal access tokens and managing API clients alongside Jetstream's existing profile features.
Package: headerx/laravel-jetstream-passport — bridges Laravel Jetstream's authentication/teams scaffolding with Laravel Passport's OAuth2 server.
Architecture fit: The package occupies a narrow but legitimate seam: Jetstream ships an opinionated auth stack (Fortify, Sanctum for API tokens, Livewire/Inertia front end), while Passport provides full OAuth2 (authorization code + PKCE, client credentials, personal access tokens). Teams that need third-party OAuth2 clients and want Jetstream's UI cannot get there without glue code. This package is that glue. It is an integration/adapter layer, not infrastructure — value is inversely proportional to how much custom wiring we'd otherwise write, and that wiring is typically 1–2 weeks of consent-screen, client-management, and guard configuration work.
Integration feasibility: High on paper, unverified in practice. Composer-installable, Laravel package conventions (service provider, config, publishable views). No data was supplied on composer.json constraints, test coverage, CI status, or install base, so feasibility is inferred from the release notes alone. The v1.0.2 addition of an authorize view is the single most consequential signal in this release: the OAuth2 authorization/consent screen is where Passport integrations most often force teams into forking vendor views. Shipping a first-party, overridable authorize view removes that fork and is the concrete reason to consider this release.
Technical risk: Moderate, concentrated in three areas.
Key questions:
composer.json constraints for laravel/framework, laravel/jetstream, and laravel/passport? Does it support the Laravel and Jetstream majors we run today, or one behind?resources/views/vendor/... (overridable, upgrade-safe) or is it rendered from the package with no publish hook (fork required to customize branding/consent copy)?
- What changed in v1.0.1? It is omitted from the provided notes.
Stack fit: Best fit is a Laravel app on Jetstream that has a hard requirement for OAuth2 authorization-code flow with third-party clients — i.e., we are the identity provider, not merely a consumer of someone else's OAuth. If our requirement is only first-party SPA or mobile tokens, Sanctum alone is lighter and this package is unnecessary scope. If our requirement includes OIDC (discovery, ID tokens), Passport is already a partial answer and this package neither helps nor hurts — budget separately.
Migration path: Treat as greenfield-only for the auth layer in v1. Adopting it on an app with live Sanctum tokens means a token migration and a guard cutover, which is a multi-sprint change with user-visible re-authentication. On a new build, it is an install-and-configure step taken before any Passport client is registered, so the authorize view is in place from the first consent prompt rather than retrofitted.
Compatibility: Pin the package version explicitly and pin Jetstream and Passport majors alongside it — a floating constraint on any of the three will eventually resolve into an untested combination. Verify the authorize view against our branding and consent copy before wiring real clients; consent-screen changes are a compliance surface (what the user is told they are granting), so it should go through the same review as a terms change, not be treated as styling.
Sequencing:
composer.json constraint questions; do not schedule dependent work against an unverified Laravel-major claim.Recommendation: Adopt in a spike now, adopt in production only after step 1 passes and the package version is pinned. The v1.0.2 authorize view is a genuine reason to prefer this over hand-rolled glue; the release notes are not sufficient evidence of maintenance health to justify adopting without the pin and the fork-exit plan.
Maintenance: Low run-rate, non-zero. The package itself is small; the ongoing cost is tracking three upgrade cadences (Laravel, Jetstream, Passport) and confirming the package keeps up. Jetstream majors are the likely break point, since Jetstream's published-file model makes adapter packages brittle. Budget roughly a half-day per Laravel major and a full day per Jetstream major, plus the cost of re-validating the published authorize view after any Passport upgrade — that view is now our code, and Passport's own consent view can change.
Support: Single-maintainer risk is the dominant operational concern. There is no vendor, no SLA, and no evidence supplied of a contributor base beyond the one named author. Mitigation is the fork-exit plan from Integration step 3: because the package is thin and we have published its view into our repo, the realistic worst case is absorbing a few hundred lines. That is an acceptable blast radius — but it must be written down, with a named owner, before adoption. Add the repo to the dependency-watch list so an archive or a stalled Laravel-major gap surfaces as a ticket rather than an incident.
Scaling: Auth-path throughput is Passport's concern, not this package's; the adapter adds no meaningful per-request overhead beyond normal view rendering on the consent screen. Scaling risk is organizational, not technical: OAuth2 client registrations, secret rotation, redirect-URI allowlists, and scope governance become a process we own. Plan for client inventory and secret rotation before the third or fourth integrating team shows up, not after.
Failure modes:
~1.0 constraint can pull in view changes without a deliberate review.Ramp-up: Half a day for a Laravel-fluent engineer to install, register a client, and walk the authorization-code flow. The real ramp is conceptual, not package-specific: engineers need a working model of Passport's grant types, the difference between first-party and third-party token issuance, and where consent fits. Budget two to three days of the team's time to get that shared understanding and document the guard model — that document, not the package, is what keeps the integration healthy.
How can I help you explore Laravel packages today?