Skip to content
Start with Identity
Standard · stable

OpenID Connect (OIDC)

OpenID Connect Core 1.0OpenID FoundationFinal, incorporating errata set 2 (15 December 2023); published as ISO/IEC 26131:2024 and ITU-T Rec. X.1285 (05/2025)Official spec ↗

What it is

OpenID Connect (OIDC) is a thin identity layer built on top of OAuth 2.0. Where OAuth gives an app delegated access, OIDC adds standardized authentication: it tells the app that a user logged in, when, how, and who they are. The core artifact is the ID token, a signed JWT the app validates locally. OIDC is the default protocol for modern single sign-on across consumer apps, mobile, SaaS, and workforce identity providers.

The normative text is OpenID Connect Core 1.0 incorporating errata set 2, dated 15 December 2023, by Nat Sakimura, John Bradley, Mike Jones, Breno de Medeiros and Chuck Mortimore.

Status (November 2026)

Item Status
OpenID Connect Core 1.0 Final, incorporating errata set 2 (15 December 2023)
ISO/IEC 26131:2024 Core published as an ISO/IEC International Standard, October 2024 (OpenID Foundation)
ITU-T X.1285 "OpenID Connect Core 1.0 - Errata Set 2", approved 29 May 2025, in force (ITU)
Companion specs Discovery, Dynamic Client Registration and the logout specs are separate OpenID Foundation documents, several also published as ISO/IEC standards

The ISO and ITU publications do not change the protocol. They matter for procurement and regulation in jurisdictions that require specifications from treaty-recognized standards bodies, which is the reason the OpenID Foundation gave for pursuing them. The OpenID Foundation's specifications page is the place to check which companion specs have ISO numbers.

How it works: the Authorization Code Flow

OIDC Core defines three flows. The Authorization Code Flow (response_type=code) is the one to use. Section 3.1 of the spec, in practice:

  1. Discovery. The client (the "relying party") fetches the provider's metadata from /.well-known/openid-configuration to learn the authorization endpoint, token endpoint, userinfo endpoint, supported algorithms and the JWKS URI.
  2. Authentication request. The client redirects the browser to the authorization endpoint with response_type=code, scope containing openid, client_id, an exactly registered redirect_uri, a state value, a nonce, and a PKCE code_challenge.
  3. User authentication. The OpenID Provider authenticates the user (password, passkey, federation, whatever its policy demands) and obtains consent if needed.
  4. Callback. The provider redirects back with a short-lived authorization code and the state.
  5. Token request. The client sends the code and the PKCE code_verifier to the token endpoint over TLS, authenticating itself if it is a confidential client.
  6. Tokens returned. The response carries an ID token, an access token, and optionally a refresh token.
  7. Validation. The client validates the ID token (next section) and establishes its own session.
  8. Userinfo (optional). The client calls the userinfo endpoint with the access token for additional profile claims.

The Implicit Flow (id_token or id_token token) returns tokens directly from the authorization endpoint, and the Hybrid Flow (code id_token, code token, code id_token token) returns some tokens there and some from the token endpoint. Both predate PKCE. The OAuth 2.0 Security BCP (RFC 9700) says clients should not use response types that issue access tokens in the authorization response, and OAuth 2.1 removes the implicit grant.

The ID token, and how to validate it

Required claims are iss, sub, aud, exp and iat. auth_time is required when max_age was requested, nonce is required when the request contained one, and acr, amr and azp are optional. The identity key is the pair iss plus sub, never email, which can change or be reassigned.

Section 3.1.3.7 lists the validation steps. The ones that matter most:

  • iss must exactly match the issuer identifier from discovery.
  • aud must contain your client_id; reject tokens listing audiences you do not trust.
  • Verify the signature with the issuer's keys. The default alg is RS256 unless you registered another. A token received directly from the token endpoint over TLS may rely on TLS for issuer authentication, but most libraries verify the signature anyway, and you should too.
  • exp must be in the future, and iat within your acceptable window.
  • If you sent a nonce, the claim must be present and match.
  • Check acr and auth_time when you asked for a level of assurance or a maximum age.

Common implementation mistakes and attacks

Mistake What goes wrong Example in our catalog
Not verifying the signature, or accepting alg: none Anyone can forge an ID token and log in as anyone CVE-2026-48558: SimpleHelp accepted unsigned OIDC tokens, skipping MFA; exploited, see the incident
Accepting algorithms you did not configure Key confusion lets an attacker sign with a key you never meant to trust CVE-2026-5430 (WSO2 API Manager), CVE-2023-29357 (SharePoint)
Loose audience on client assertions A private_key_jwt assertion meant for one server is replayed at another CVE-2025-27370, technique token replay at an unbound endpoint
Trusting tokens across tenants of a multi-tenant IdP Any tenant's user is accepted cross-tenant token confusion
Keying accounts on email instead of iss + sub Account takeover when a provider lets users set an unverified email Pattern, not a single CVE
Skipping state, nonce or PKCE Login CSRF and authorization code injection RFC 9700 sections 4.5 and 4.7
Using the ID token to call APIs APIs accept a token whose audience is the client, not the API Use the access token

OIDC does not protect a user who completes a real login on a proxy: adversary-in-the-middle phishing captures the resulting session cookie regardless of protocol. That is an authenticator problem, solved by phishing-resistant MFA at the provider.

When to use it

Any time you need to log a user in. Reach for OIDC over raw OAuth for authentication, and over SAML when building modern web, mobile, or API-centric apps. SAML still wins where an enterprise customer's IdP only speaks SAML, which is why B2B products often support both.

Who implements it

Almost every identity provider and CIAM platform ships an OIDC provider. The OpenID Foundation runs a certification program; certified OpenID Provider entries we saw on 5 November 2026 include Auth0, ForgeRock, Keycloak, Curity, Gluu, authentik and Akamai Identity Cloud. Certification is per product version, so check the list for the release you run. For choosing a provider, see the CIAM buyer guide and the IAM buyer guide.

How to check an implementation

  1. Decode a real ID token with the JWT decoder and confirm iss, aud, exp and nonce are what you expect.
  2. Change one byte of the signature and replay it. Your app must reject it.
  3. Re-sign the header as "alg": "none" with an empty signature. Rejected.
  4. Send a token issued for another client ID. Rejected on aud.
  5. Omit nonce from a callback where you sent one. Rejected.

How it works, message by message

The OIDC message-flow walkthrough shows each HTTP exchange of the authorization code flow with annotated values: discovery, the authentication request, the callback, the token request with PKCE, the token response and a decoded ID token, with every parameter tied to its OIDC Core or RFC section. Check a provider's metadata with the OIDC discovery checker.

Guides: OAuth vs OIDC, SAML vs OIDC, implementing OAuth 2.0 and OpenID Connect, implementing SSO. Glossary: OIDC, ID token, claims, identity provider, relying party.

Who wrote it

OpenID Connect was authored by a group including Nat Sakimura, Mike Jones, and John Bradley. Vittorio Bertocci did much of the work of explaining it to developers, and Filip Skokan and Roland Hedberg maintain certified implementations. More in the experts directory.

OpenID Connect (OIDC): frequently asked questions

What is OpenID Connect (OIDC)?
OpenID Connect is a thin identity layer built on top of OAuth 2.0. Where OAuth grants an app delegated access to resources, OIDC adds standardized authentication: it proves that a user logged in and returns who they are through a signed ID token. It is the modern foundation for single sign-on across web, mobile, and API-centric apps.
What is the difference between OpenID Connect and OAuth 2.0?
OAuth 2.0 is an authorization framework: it lets an app act on a user's behalf without handling their password. OpenID Connect adds authentication on top, telling the app who the user is via an ID token. Use OAuth for delegated access to APIs, and OIDC when you need to log a user in.
What is the difference between an ID token and an access token?
An ID token is proof of authentication, a signed JWT with claims about the user (subject, name, email, authentication time) that the app validates and reads. An access token is an OAuth credential used to call APIs. Do not use an ID token to call APIs, and do not treat an access token as proof of who the user is.
Is OpenID Connect the same as SAML?
No. Both enable single sign-on, but OIDC is a modern JSON and JWT-based protocol suited to web, mobile, and APIs, while SAML 2.0 is an older XML-based standard still common in enterprise federation. New applications generally choose OIDC; SAML persists where enterprise identity providers and legacy integrations require it.
Is OpenID Connect an ISO standard?
Yes. OpenID Connect Core 1.0 incorporating errata set 2 was published as ISO/IEC 26131:2024 in October 2024, and the ITU-T approved the same text as Recommendation X.1285 on 29 May 2025. The OpenID Foundation version at openid.net remains the reference most implementers read, and the three texts are technically aligned.
Which OpenID Connect flow should a new application use?
The Authorization Code Flow (response_type=code) with PKCE, for web, mobile, and single-page apps alike. OIDC Core also defines the Implicit and Hybrid flows, but the OAuth 2.0 Security Best Current Practice (RFC 9700) says clients should not use response types that return access tokens in the authorization response, and OAuth 2.1 removes the implicit grant.
Which ID token claims must a client validate?
At minimum: the signature against the issuer's published keys, iss matching the expected issuer exactly, aud containing your client_id, exp in the future, and nonce matching the value you sent if you sent one. Check azp when present, auth_time when you requested max_age, and acr when you requested a specific authentication level.
Last reviewed By SWI Community TeamSuggest a correctionHow we research
Independent, community-driven reference. Always confirm details against the official specification linked above.