Core concepts

Identity, scopes, and claims

Understand how an approved scope request becomes an app-scoped identity and token claims.

Unbound gives an app a pairwise identity scoped to its origin and includes only claims allowed by the approved scopes and available from the provider.

Pairwise identity by app origin

The token’s sub claim is the user’s app-scoped Unbound ID. It is derived from the upstream provider subject, the destination app origin, and the Unbound deployment secret.

The same underlying identity receives a different sub for each app origin. This reduces direct cross-app correlation through a shared Unbound identifier, but it does not guarantee anonymity or prevent correlation through other data.

Changing the Unbound deployment secret changes pairwise IDs, so apps should not assume those IDs survive a server secret rotation.

Current scopes

ScopeEffect
openidCauses id_token to be included in the token response. In the current implementation, it is the same signed JWT as the access token.
profileAllows name and picture claims when those values are available.
emailAllows email and potentially email_verified when those values are available.

Scopes are explicit categories, not a guarantee that every corresponding field exists. Request only what the app needs, and handle optional fields as absent.

Always-present JWT claims

The signing path sets these claims on issued tokens:

ClaimMeaning
issThe Unbound issuer origin at token exchange.
subThe pairwise, app-scoped Unbound user ID.
audThe public client ID in origin:<app origin> form.
iatToken issue time as Unix seconds.
expToken expiration as Unix seconds.
jtiA random identifier for this token.

Apps must validate the expected iss and aud; reading these fields is not itself validation.

Conditional claims

ClaimIncluded when
nameprofile was approved and the provider supplied a usable value.
pictureprofile was approved and the provider supplied a usable value.
emailemail was approved and the provider supplied a usable value.
email_verifiedemail was approved and a value survives the current code and token processing. It is optional.
nonceA nonce was supplied in the authorization request.

Current limitation

An upstream email_verified value of false can currently become an omitted downstream claim. Treat email_verified as optional; do not interpret absence as verified or unverified without an app policy.

The downstream token does not include the provider name or raw provider user ID. The app receives the pairwise Unbound subject instead.

Identity is not authorization

A valid token tells the app which pairwise identity was authenticated and which approved claims were issued. The app still owns:

  • account linking and lifecycle decisions;
  • roles, permissions, and feature access;
  • moderation and acceptable-use enforcement;
  • storage and protection of received claims; and
  • its own session creation and logout behavior.

Security requirement

Before trusting identity, validate the JWT signature, allowed algorithm and key, issuer, audience, expiration, and every claim your decision depends on. Browser-default decoding does not perform these checks.

Return to How Unbound works for the flow that produces these claims, or continue to the token reference for the exact current token contract.

On this page