phil / identity-client-bundle
OpenID Connect sign-in for Symfony on the native oidc_login authenticator: one semantic configuration, sub-indexed provisioning, validated return_to, replay-guarded back-channel logout, a session cap, step-up by acr_values and max_age, and serialized token refresh
Package info
github.com/parler-haut-interagir-librement/identity-client-bundle
Type:symfony-bundle
pkg:composer/phil/identity-client-bundle
Requires
- php: >=8.5
- ext-sodium: *
- ext-uri: *
- psr/cache: ^3.0
- psr/clock: ^1.0
- psr/event-dispatcher: ^1.0
- psr/log: ^3.0
- symfony/cache: ^8.2
- symfony/clock: ^8.2
- symfony/config: ^8.2
- symfony/dependency-injection: ^8.2
- symfony/framework-bundle: ^8.2
- symfony/http-client: ^8.2
- symfony/http-foundation: ^8.2
- symfony/http-kernel: ^8.2
- symfony/lock: ^8.2
- symfony/security-bundle: ^8.2
- symfony/security-core: ^8.2
- symfony/security-http: ^8.2
- web-token/jwt-library: ^4.2
Requires (Dev)
- phpbench/phpbench: ^1.4
- phpunit/phpunit: ^13.4
- psr/container: ^2.0
- symfony/browser-kit: ^8.2
- symfony/http-client-contracts: ^3.6
- symfony/routing: ^8.2
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-12 23:51:40 UTC
README
Sign the users of a Symfony application in through any OpenID Connect provider, hardened.
phil/identity-client-bundle configures the oidc_login authenticator of Symfony from one block of configuration. It
writes the firewall, pins the signature algorithm and adds what a relying party needs beyond the sign-in flow: a
validated return_to, a back-channel logout that accepts each token once, a session cap, step-up by acr_values and
max_age, and token refresh that never presents a rotated refresh token twice.
It is for Symfony applications that delegate authentication to an OpenID Connect provider. The flow itself, the state and nonce, discovery, the signature checks and client authentication all stay Symfony's own.
Status
| Part | State |
|---|---|
Semantic configuration composing the oidc_login firewall |
Implemented and tested |
Provisioning on sub, kept claims, tokens dropped from the session |
Implemented and tested |
return_to validated against declared origins |
Implemented and tested |
Back-channel logout with jti replay guard, session cap |
Implemented and tested |
Step-up: voter, acr_values, max_age, RFC 9470 challenge |
Implemented and tested |
| Serialized token refresh | Implemented and tested |
An independent security review is expected before a first release.
Documentation
| Document | What it covers |
|---|---|
| Installation | Requirements, registering, the firewall, the routes. |
| Configuration | Every key, and what it composes. |
| Provisioning | UserProvisioner, the identity, what the session keeps. |
| Return to | The parameter, the policy, where a sign-in lands. |
| Logout | Back-channel logout, the replay guard, the session cap. |
| Step-up | Assurance levels, the voter, the challenge. |
| Token refresh | The lock, the shared outcome, family revocation. |
| Extension points | Ports, events, services. |
| Security | The threats covered and what stays with the application. |
| Testing | How the bundle is tested. |
Quick start
# config/packages/security.yaml security: firewalls: main: lazy: true
# config/packages/phil_identity_client.yaml phil_identity_client: issuer: 'https://id.example.org' client_id: 'example-site' client_secret: '%env(OIDC_CLIENT_SECRET)%' claims: ['name', 'email']
# config/routes/security.yaml oidc_login: resource: security.route_loader type: service
A link to /oidc/start?return_to=/account signs the user in and lands on the account page.
Requirements
PHP 8.5 or later with ext-sodium and ext-uri; Symfony 8.2's security bundle and components, framework bundle, HTTP
client, cache, clock and lock; web-token/jwt-library 4.2, which the oidc_login authenticator runs on.
Contributing
Contributions are welcome on the PHIL monorepo: read the contribution guide and the code of conduct. Report a vulnerability privately, as the security policy explains, never in a public issue.
License
MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. See LICENSE.