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

Openid Connect Provider Bundle Laravel Package

ajgarlag/openid-connect-provider-bundle

A Symfony bundle that adds OpenID Connect Provider support on top of league/oauth2-server-bundle, providing standards-compliant discovery and RP-initiated logout endpoints with configurable routes and sensible defaults.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Revised for 0.3.0. Prior assessment was against 0.2.7.

Architecture Fit

The core finding is unchanged: this is a Symfony bundle, not a Laravel package. A Bundle class, a DependencyInjection extension, a config tree, PHP-route files loaded via config/routes/*.yaml, and hard runtime coupling to league/oauth2-server-bundle and Doctrine mapping passes. None of that surface exists in Laravel, and 0.3.0 did not move in that direction — the new "custom clients" capability is a Symfony DI tagged-service extension point, which is even more framework-bound than what came before.

  • Drop-in fit for a Laravel codebase: still zero. No bridging layer, no config equivalent, no auto-registration.
  • Fit for a Symfony codebase: improved but now more coupled. 0.3.0 requires league/oauth2-server-bundle:^2, a major-version jump in the one dependency that owns the actual OAuth2 state machine, client storage, and grant handling. The bundle is thin — that is its virtue — but thin means most of your upgrade risk lives one layer down.
  • What is transferable remains the specification surface, and 0.3.0 adds two items worth copying into any port: kid in the JWKS payload (the prerequisite for overlapping-key rotation) and a pluggable client-resolution abstraction. A Laravel team should treat this repo as a conformance checklist and reference design, not a dependency.

Technical Risk

Risk Severity Change since 0.2.7 Evidence
Bus factor = 1 High Unchanged Every PR in 0.3.0 (#28, #30, #34, #39, #40) authored by @ajgarlag. Five releases of consistent solo authorship is now a pattern, not a data point.
Dependency major bump in a minor release High New 0.3.0 adopts league/oauth2-server-bundle:^2. That is a breaking change to your transitive dependency graph delivered under a 0.x minor. Consumers must migrate the League layer and then take this bundle.
Narrowing support matrix High Worsened 0.2.4 dropped Symfony 7.2/7.3 in a patch; 0.3.0 "completes Symfony 8.0 removal from workflows." Tested surface now appears to be Symfony 7.4 only. Verify before assuming 8.0 compatibility.
Pre-1.0, breaking changes permitted High Unchanged (structurally) 0.2.0 renamed ClaimsResolveEvent → UserClaimsResolveEvent. 0.3.0's dependency bump is the same hazard by proxy.
No production evidence High Unchanged 9 stars, 0 dependents. Still no named adopter.
Documentation still "TBD" Medium-High Unchanged No docs PR in this release. The kid and custom-client features ship undocumented beyond the changelog line.
Key lifecycle Medium-High → Medium Improved kid now appears in the JWKS payload (PR #30), which is the hard prerequisite for publish-both-keys rollover. The plumbing gap is closed; the policy/tooling gap (rotation schedule, overlap window, KMS custody) remains yours to build.
Client onboarding Medium → Medium Partially improved Custom-client support (PR #28) makes it feasible to back clients with your own registry/repository instead of static Doctrine entities. It is not dynamic client registration — onboarding is still a human, out-of-band process.
No PKCE guidance Medium-High Unchanged Still unmentioned; still mandatory-in-practice for public clients. Must be configured in the League layer.
Scope gaps Medium Unchanged No dynamic client registration, no PAR, no DPoP/mTLS, no introspection/revocation surface described; Implicit Flow still present.
Conformance evidence Medium-High Unchanged No OpenID Foundation Conformance Suite results in-repo.
Metadata anomaly Low-Medium Unchanged Changelog still carries a release date inconsistent with its contents — verify supply chain before adoption.

Net read: 0.3.0 is a substantive release, not a housekeeping bump. Two of the three highest-severity technical gaps from the prior assessment (key rotation plumbing, rigid client storage) were directly addressed. The maintainer is responsive and reading the same gap list a reviewer would. But it also introduced a fresh integration risk (League v2 migration) and tightened the framework window again — so the risk profile is flatter, not uniformly lower.

Key Questions to Answer Before Any Commitment

  1. Symfony or Laravel target? Unchanged and still the first question. If Laravel, this is a reference, not a dependency.
  2. Provider or relying party? Unchanged. Most "we need OIDC" asks are RP-side and solved by Socialite/OIDC client middleware.
  3. What is the actually-tested Symfony version? 0.3.0 removed Symfony 8.0 from CI. Confirm 7.4-only before planning. If we are on 8.0, this bundle is now a non-starter without a fork.
  4. Are we prepared to migrate league/oauth2-server-bundle to v2 in lockstep? This is the new gating question. Scope the League v2 delta (breaking changes in grant types, client repository interfaces, token storage) before committing to 0.3.0.
  5. Does "custom clients" get us to self-service onboarding? PR #28 enables a custom client backend; it does not add a registration endpoint or metadata validation. Confirm what it actually unlocks versus what we would still have to build.
  6. Who owns signing-key custody and rotation, now that kid exists? The bundle publishes kid; it does not schedule rotation, publish overlapping keys, or retain retired keys. That runbook is ours.
  7. Conformance Suite result on the flows we need? Still no third-party evidence.
  8. Can we afford to fork and own it? Unchanged in substance, but the calculus shifted slightly: the code is now more capable and more worth forking, and the upstream dependency surface is more volatile.

Integration Approach

Stack Fit

Recommendation matrix for a Laravel target — unchanged, with a note on why Option C got marginally better:

Option Fit Effort Verdict
A. Delegate to a dedicated IdP (Keycloak, Ory Hydra, Authentik, Zitadel) Excellent 2–3 wks integration Still the default. 0.3.0's improvements close gaps that a mature IdP already closed years ago.
B. Laravel-native OIDC provider on Passport / league/oauth2-server Good 3–5 wks incl. conformance Viable when policy forbids an external IdP.
C. Port this bundle's OIDC layer into Laravel Poor-to-moderate 6–10 wks Slightly more attractive as a design source: kid-aware JWKS and a pluggable client resolver are both patterns worth lifting. Still bad as a code port.
D. Install as-is None — Not possible on Laravel.

For a Symfony target, Option D becomes viable and is now more viable functionally — but the entry cost rose, because 0.3.0 drags league/oauth2-server-bundle v2 into the upgrade. Budget 2 days of spike for the bundle itself plus 3–5 days for the League v2 migration if you are currently on v1.

Migration Path

If pursuing a port (Option B/C), the phased plan from the prior assessment holds; two phases need revision:

  1. Discovery + JWKS — low risk, immediately useful. Updated: emit kid in every JWK from day one, even with a single key. Retrofitting kid after clients have cached a kid-less JWKS is an avoidable outage. Design the JWKS handler to serve an array of keys, not one.
  2. ID token issuance (Authorization Code) — iss, sub, aud, exp, iat, auth_time, nonce, plus at_hash/c_hash. Set the JWT header kid to match the JWKS entry used to sign. nonce echoes only if present in the request (upstream fixed this in 0.2.5 — inherit the fix).
  3. UserInfo endpoint + custom claims via a UserClaimsResolving event/listener analogue to UserClaimsResolveEvent. Still the single best design idea in the repo.
  4. Client resolution abstraction — new phase, informed by PR #28. Abstract client lookup behind an interface rather than binding to an ORM entity. This is what makes phase 6 (self-service or admin-driven onboarding) possible later without a rewrite, and it decouples protocol code from persistence.
  5. RP-Initiated Logout with id_token_hint, post_logout_redirect_uri, state, and sid matching. Highest historical bug density (0.2.1 sid comparison, 0.2.5 error messages). Budget test time.
  6. Hardening — PKCE enforcement, exact-match redirect-URI allowlisting, token TTL policy, ±60s clock skew, key-rotation runbook with overlapping JWKS publication.

Compatibility & Sequencing

  • New sequencing constraint: if you adopt 0.3.0 on Symfony, upgrade league/oauth2-server-bundle to v2 first, in isolation, behind the existing bundle version if possible. Do not conflate the League v2 migration with an OIDC feature change — you will not be able to attribute regressions.
  • Framework window: confirm Symfony 7.4. Treat Symfony 8.0 as unsupported until the maintainer restores it to CI. This may itself be the deciding constraint.
  • Pin exactly 0.3.0, not ^0.3. The maintainer has a demonstrated record of dropping framework support in patch releases and shipping dependency majors in minors.
  • Client compatibility: still verify one SPA (PKCE, public), one confidential server-side app, and one mobile client before declaring done.
  • Logout sequencing rule still stands: do not start at logout. It depends on sid being correctly embedded from the ID-token step and on a session store consistent across auth and logout hosts.

Operational Impact

Maintenance

  • As a Symfony dependency: 0.3.0 is the clearest evidence yet that this library is actively developed — five PRs, two of them addressing gaps a reviewer would flag. That is reassuring on responsiveness and unchanged on durability: still one maintainer, still pre-1.0, still no dependents to absorb the QA burden. Budget 2–4 days per release cycle for compatibility review, plus a larger one-off for the League v2 jump.
  • As a Laravel port: you own the code. Bounded, reviewable, and — with kid now understood — you can implement key rotation properly from the start rather than inheriting an ambiguous story.
  • As delegation to Keycloak/Hydra: maintenance collapses to config and upgrade runbooks. Still the only genuinely low-maintenance option.

Support & Ramp-Up

  • Documentation is still "TBD." 0.3.0 shipped two user-facing capabilities (kid, custom clients) with no documentation beyond a changelog bullet. Onboarding cost is unchanged: an OIDC-spec-literate engineer reading source.
  • Ramp estimates unchanged — 1–2 weeks for someone fluent in OAuth2; 3–5 weeks for a team learning OAuth2/OIDC and the codebase simultaneously.
  • Community support still negligible. 9 stars, 0 dependents, no StackOverflow corpus, no third-party write-ups. Every problem is first-principles.
  • Mitigation unchanged and still the highest-ROI action: one engineer reads OIDC Core + Discovery + RP-Initiated Logout, then runs the OpenID Foundation Conformance Suite. The output is reusable regardless of which option you ultimately pick.

Scaling

  • Protocol layer — unchanged. Stateless signing and JSON serialization; scaling is a PHP-FPM/opcache concern.
  • Key rotation — materially improved. With kid published in JWKS, overlapping-key rotation is now implementable. The remaining gap is policy and custody: rotation schedule, overlap window ≥ one token lifetime, retention of retired keys for in-flight validation, and a KMS/HSM or encrypted versioned key store. This is now an engineering task you can schedule rather than an unresolved design question — that is a real de-risking.
  • Client registry — improved. Custom-client support means the registry can live in your own store with your own schema and validation, which is the foundation for admin tooling or eventual self-service registration. Dynamic client registration (RFC 7591) is still absent and still yours to build if required.
  • Load-bearing gap has shifted from "no rotation story" to "no rotation runbook." Throughput was never the blocker; documentation and operational ownership still are.

Failure Modes to Design For

  • kid absent or mismatched (new) → RPs that cache JWKS by kid fail validation outright; some fail silently. Always emit kid; always match the JWT header to the JWKS entry; alert on signing-key/kid divergence.
  • Key rotation without a grace period → every relying party fails validation simultaneously. Publish old + new keys in JWKS for at least one token lifetime, and keep retired keys valid for in-flight tokens. Now solvable — but only if the runbook exists.
  • kid rotation behind a CDN → clients serve a stale JWKS and reject newly signed tokens. Set explicit cache headers and shorten TTL around rotation windows.
  • sid mismatch on logout → session not terminated at the RP; a silent, security-relevant failure. Regression-test explicitly; upstream has had two bugs here.
  • nonce not echoed / mis-echoed → replay surface or client-side rejection. Upstream fixed this in 0.2.5.
  • Clock skew on exp/iat/auth_time → intermittent failures that read as flakiness. Allow ±60s and monitor.
  • League v2 behavioral drift (new) → grant, client-resolution, or token-storage semantics changed beneath you. Characterization-test the auth-code and refresh flows before and after the upgrade.
  • Implicit Flow enabled by accident → tokens in URL fragments leaking via referrer/logs. Disable unless a specific legacy client demands it.

TPM Recommendation

Recommendation stands: use this repository as a design reference and conformance checklist, not as a runtime dependency in a Laravel product — Laravel remains structurally impossible. For a Symfony product, 0.3.0 upgrades the package from "unproven and missing the key-rotation primitive" to "unproven but architecturally sound." The kid and custom-client additions remove two of the three reasons a TPM would have said no on technical grounds; the remaining objections are non-technical — one maintainer, no production evidence, no docs, and a support matrix that has narrowed three times in five releases, most recently to Symfony 7.4 only.

If the strategic goal is "we are an OIDC Provider," the default recommendation is still a dedicated IdP, with engineering budget spent on integration and conformance rather than on owning a nascent library. Reserve this bundle for the case where policy forbids an external IdP and the team is on Symfony 7.4 and can fund a fork-and-own decision — in which case 0.3.0 is a meaningfully better starting point than 0.2.7 was.

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.
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode