Nametag
Stays with the agent. aud is the client_id. Answers who signed in — not what the API may do.
OIDF · Final 2014; errata set 2 current
OpenID.Core
N. Sakimura, J. Bradley, M. Jones, B. de Medeiros, C. Mortimore
User-delegated agents still need to know which human they serve. OIDC remains the way that human authenticates to the authorization server. XAA even starts from an ID Token as the subject_token.
At a glance
Actors
In one board · OIDC vs OAuth
Two tickets come back from the token endpoint. They look related. They are not interchangeable. Sending the ID Token to an MCP server is the classic mix-up.
→ Authenticates →
→ ID Token — aud is the client →
→ Access token — aud is this API →
Nametag
Stays with the agent. aud is the client_id. Answers who signed in — not what the API may do.
Pass
Goes to the resource. Glue it to a key with DPoP if the runtime is untrusted. Still a photocopy until you do.
OpenID Connect is the identity layer on OAuth. An ID Token is not an access token. Side-by-side.
01
OAuth 2.0 does not tell the client who authenticated. OpenID Connect adds an ID Token and a UserInfo endpoint so a relying party can obtain an authenticated end-user identity. User-delegated agents still need to know which human they serve; OIDC remains the way that human authenticates to the authorization server.
Mixing the layers is the most common design error in agent stacks: sending the ID Token to an MCP server, treating sub as a SPIFFE ID, or assuming OIDC authorized a specific tool call. XAA even starts from an ID Token as the subject_token — at the IdP, not at the API.
02
The end-user authenticates to the OpenID provider (OP). The relying party (the agent host / client) consumes the ID Token; aud is the client_id. The OP is also an OAuth AS. Resource servers are not OIDC relying parties and must not accept ID Tokens as access tokens.
03
Authorization Code flow (with PKCE in modern deployments) adding scope=openid. Token endpoint returns an ID Token (JWT) plus an access token (and optional refresh token). RP validates iss, aud (the client_id), exp, iat, nonce, signature; optional azp, at_hash, c_hash. UserInfo endpoint, authorized by the access token with openid scope, returns additional claims. Implicit and hybrid exist in the 2014 spec; do not use them for new agents.
OpenID Connect Core 1.0 incorporating errata set 2. Authors: N. Sakimura, J. Bradley, M. Jones, B. de Medeiros, C. Mortimore. Final 2014 with ongoing errata.
04
Flow 1
RP redirects with scope=openid (plus others), nonce, PKCE, resource if also requesting API access.
User authenticates at the OP. Consent covers identity and any API scopes.
Token endpoint returns id_token + access_token. RP validates the ID Token locally.
RP keeps the ID Token. It uses the access token (audience-restricted) at APIs. Optional UserInfo call.
If a design says 'the agent sends the ID Token to the MCP server', that design is wrong.
05
Identity and authentication of the user. Authorization of API access remains OAuth (the access token). Client authentication is still OAuth client auth. AAuth reuses OIDC claim names so identity-aware resources can keep their user model without becoming OIDC RPs.
06
OIDC is an identity layer on OAuth 2.0.
Same relationship; use 2.1-shaped code+PKCE to obtain the ID Token.
How the RP finds the OP.
ID Token (or refresh) is the subject_token for minting an ID-JAG.
Reuses sub/email/groups/roles; does not issue ID Tokens.
Decoupled OIDC authentication/consent when the user is on another device.
07
aud is the client. An API that accepts it is trusting the wrong audience. MCP wants an access token minted for the MCP server.
Replay of an ID Token into a different agent session. Always send and check nonce on interactive flows.
The same human may have different sub values at different RPs. Do not use sub as a global person identifier across OPs either — always (iss, sub).
08
OIDF Final, 2014, errata set 2 current. Stable. Implement with RFC 9700/OAuth 2.1 practices (PKCE, no implicit). https://openid.net/specs/openid-connect-core-1_0.html
An ID Token is not an access token. Do not send it to APIs. AAuth reuses OIDC claim names (sub, email, groups) so identity-aware resources can keep their existing user model.