Skip to main content
Token Exchange is currently in preview. The API and behavior may change as we continue to refine the feature.
Token exchange allows you to exchange tokens for Civic Auth access tokens, enabling seamless integration between different authentication systems and Civic-powered applications. Civic Auth supports two token exchange scenarios:
  1. Civic Token Exchange - Exchange an existing Civic access token for a new token with different scopes or extended validity
  2. Federated Token Exchange - Exchange tokens from external identity providers (Google, Auth0, Azure AD, etc.) for Civic access tokens
Both flows implement the OAuth 2.0 Token Exchange (RFC 8693) standard.

Use Cases

Best for: Delegating tokens with reduced permissions
  • Scope Reduction: Create tokens with fewer permissions for specific tasks or services
  • Agent Delegation: Issue constrained tokens to AI agents or automated systems that cannot exceed their granted permissions
  • Least Privilege: Follow security best practices by granting only the minimum required access for each operation

Configuration

Token Exchange can be set up in the Civic Auth Dashboard under Setup > Token Exchange.
Token Exchange configuration in the Civic Auth Dashboard

Quick Start

Prerequisites

  1. A Civic Auth application with client credentials (client ID and secret)
  2. For federated exchange: An external identity provider configured in the Civic Auth Dashboard

Request Parameters

Basic Token Exchange Request

Response

Civic Token Exchange

Exchange an existing Civic access token for a new token with different scopes or expiration. The sub claim from the original token is preserved in the exchanged token.

Configuration

Enable Civic Token Exchange by toggling it on in the Dashboard under Setup > Token Exchange.

Example: TypeScript

Federated Token Exchange

Exchange tokens from external identity providers for Civic access tokens. Unlike Civic token exchange, the external user’s sub is mapped to a new or existing Civic Auth user, and the resulting token contains the Civic user’s sub.

How It Works

Configuration

Add one or more external identity providers in the Dashboard under Setup > Token Exchange > Add Provider. Select a preset (Google, Auth0, Azure AD) or choose Custom, then configure the provider settings:

Example: React with Google OAuth

Using a Google ID token is recommended for federated exchange — it contains identity claims (email, name, picture) that Civic Auth can map to the new user account.
Google ID tokens include claims like email, name, and picture by default. Civic Auth automatically maps these to the user account during federated exchange, so new users are created with their profile information already populated.

Example: Node.js Backend

Provider Configuration Examples

The audience should be your Google OAuth client ID.
Replace YOUR_TENANT with your Auth0 tenant name. The audience should match your Auth0 API identifier.
Replace YOUR_TENANT_ID with your Azure AD tenant ID (GUID).
For providers not listed above, you’ll need to obtain the following information from your provider’s documentation:
  1. Issuer URL: The value of the iss claim in tokens issued by the provider
  2. JWKS Endpoint: Usually at /.well-known/jwks.json relative to the issuer
  3. Token Format: Ensure the provider issues JWTs (access tokens or ID tokens, not opaque tokens)
If your provider doesn’t expose a JWKS endpoint, you can use a static public key in PEM format:

User Account Linking

When a user performs federated token exchange for the first time, Civic Auth automatically:
  1. Creates a new user account if no existing account matches the external user
  2. Links to an existing account if a user with the same verified email exists (when email linking is enabled)

Default Claim Mapping

Civic Auth automatically maps the following claims from the external token to the Civic user account: The sub claim combined with the provider’s issuer URL creates a stable identity mapping, ensuring:
  • The same external user always maps to the same Civic account
  • Different external users never collide
  • Users can link multiple external providers to a single Civic account

API Reference

Token Exchange Endpoint

Request Body

Client secret can alternatively be provided via HTTP Basic authentication header.

Success Response

Error Response

Security Considerations

Token Validation

Civic Auth performs comprehensive validation on all subject tokens:
  • Signature Verification: Tokens must be signed by the configured provider’s private key
  • Issuer Validation: The iss claim must exactly match the configured issuer URL
  • Audience Validation: If configured, the aud claim must match
  • Expiration Check: Tokens must not be expired
  • Algorithm Check: Only configured algorithms are accepted (default: RS256)

Best Practices

Use HTTPS

Always use HTTPS for token exchange requests

Secure Client Secrets

Store client secrets securely; never expose them in client-side code

Short Token TTLs

Request only the token validity you need

Minimal Scopes

Request only the scopes required for your use case
Validate Tokens: Always validate Civic tokens on your backend before trusting claims.

JWKS Caching

Civic Auth caches external provider JWKS for performance and reliability:
  • Cache TTL: 1 hour
  • Automatic refresh on key rotation
  • Graceful fallback during provider outages

Troubleshooting

  • Ensure the external provider is configured in the Dashboard
  • Verify the issuer URL exactly matches the iss claim in the token
  • Check that the JWKS endpoint is correct and accessible
  • Verify the token hasn’t been tampered with
  • Ensure the provider is using one of the configured algorithms
  • External tokens have their own expiration; exchange them promptly
  • Civic tokens respect both the external token’s remaining validity and the configured max TTL
  • Ensure the external token contains a sub claim with the user’s unique identifier