In the Maverics Console, the combination of applications, policies, headers, and connector bindings is managed through User Flows. In YAML, these elements are configured directly within each app’s configuration block under
apps[].policies[].Overview
An OIDC app registers an OpenID Connect client with the Orchestrator’s OIDC Provider mode. Each app entry defines a client with its own credentials, redirect URLs, grant types, and token settings. The Orchestrator issues ID tokens, access tokens, and refresh tokens to registered clients, acting as a standards-compliant authorization server.How It Works
The OIDC Provider authentication flow follows these steps:- Application redirects — A user accesses an application registered as an OIDC relying party. The application redirects the user to the Orchestrator’s authorization endpoint.
- Upstream authentication — The Orchestrator routes the user to the configured upstream identity provider (Microsoft Entra ID, Okta, etc.) for authentication. If multiple IdPs are configured, failover rules determine which to use.
- Attribute enrichment — After authentication, the Orchestrator loads additional attributes from configured attribute providers (directories, databases, APIs) and enriches the user’s profile.
- Token issuance — The Orchestrator generates OIDC tokens (ID token, access token, optional refresh token) with claims mapped from the authenticated identity and enriched attributes.
- Application receives tokens — The application receives the tokens at its redirect URI and uses them for session establishment and authorization decisions.
- Ongoing token operations — The Orchestrator serves the JWKS endpoint for token verification, handles token introspection and revocation, and manages token refresh flows.
Use Cases
- SSO consolidation — Unify multiple IdPs behind a single OIDC interface so applications authenticate against one provider.
- IdP migration with zero downtime — Move users between identity providers transparently while applications continue to use the same OIDC endpoints.
- Legacy app modernization — Add OIDC-based authentication to older applications without rewriting them.
- Claim enrichment from multiple sources — Combine attributes from multiple Identity Fabric connectors into a single set of OIDC claims.
Key Concepts
Claims Mapping
Claims mapping translates attributes from upstream identity providers into OIDC token claims. The formatconnector.attribute (e.g., upstream-idp.email) references a specific claim from a named connector. This enables enriching tokens with data from multiple identity sources.
IdP Failover
When multiple identity providers are listed underauthentication.idps, the Orchestrator tries them in order. If the primary IdP is unavailable, authentication falls back to the next provider seamlessly — no application changes required.
Token Types
The Orchestrator issues two token formats: JWT tokens (self-contained, verified via JWKS) and opaque tokens (reference tokens, verified via introspection). Choice depends on whether resource servers can validate locally or must call back.Service Extensions
Go-based extension hooks allow custom logic at key points in the flow — custom authentication checks, custom claim building, and custom attribute loading. These provide escape hatches when standard configuration is insufficient.Setup
- Console UI
- Configuration
OIDC applications are configured under Applications in the Maverics Console.
Navigate to Applications
Go to Applications in the sidebar and click Create. Select OIDC-based from the application type list.
Configure client credentials
Enter the Client ID that OIDC clients will use to authenticate. Choose the Client Authentication Method: Client Secret or JWT Client Authentication (RFC 7523).If using client secrets, click Add Client Secret to add one or more secrets.
Configure redirect URLs
Click Add Redirect URL to add allowed redirect URLs for the authorization code flow. Optionally enable Default Redirect URL (Fallback) to use the first URL when authorization requests omit the
redirect_uri parameter.Per the OIDC RFC,
redirect_uri is a required parameter. Only enable the fallback for apps that cannot provide a redirect URI.Configure logout redirect URLs
Click Logout Redirect URL to add URLs where logout responses can be sent.
Configure security settings
Enable Public Client for single-page or native applications that cannot securely store credentials. Public clients support Authorization Code (with PKCE), Refresh Token, and Implicit flows only.
Configure DPoP (optional)
Enable Require DPoP (Demonstrating Proof of Possession) if clients must provide DPoP proofs. DPoP proofs must include a nonce claim per RFC 9449.
Configure CORS
Click Allowed Origins to add origins authorized to make cross-origin requests. Enable Include Credentials to include credentials in CORS response headers (only for trusted origins you control).
Configure PKCE
Enable Bypass Proof Key for Code Exchange (PKCE) only for legacy apps that cannot use PKCE. Per OAuth 2.0 security best practices, public clients MUST use PKCE with the Authorization Code grant type.
Select grant types
Choose which grant types this client supports.Recommended and Modern Flows: Authorization Code, Refresh Token.Machine to Machine and Agentic Flows: Client Credentials, Token Exchange.Legacy or Deprecated Flows: ROPC, Implicit (ID Token), Implicit (Access Token).
Configure audiences (optional)
Click Allowed Audience to specify which resources are authorized to receive tokens.
Configure access token settings
Select the token Type (JWT or opaque). Optionally set Lifetime Seconds (default: 1 hour) and Length (for opaque tokens, 22—256 characters).
Configure refresh token settings
Enable Allow Offline Access to allow refresh tokens. Optionally set Lifetime Seconds (default: 24 hours) and Length (22—256 characters).
DPoP (Demonstrating Proof-of-Possession)
DPoP (RFC 9449) creates sender-bound access tokens — the token is cryptographically tied to a specific client’s key pair, preventing token theft and replay attacks. When a client presents a DPoP-bound access token, it must also present a proof that it possesses the private key. If an attacker intercepts the access token, they cannot use it without the client’s private key. DPoP is configured per-app on OIDC Provider applications. When enabled, the Orchestrator validates DPoP proof headers on token requests and issues sender-bound access tokens.- Console UI
- Configuration
DPoP is configured per-app via YAML only. The Console UI manages primary OIDC Provider settings (issuer, endpoints, signing keys) in the Deployment Settings dialog, but per-app token binding settings like DPoP are not yet available in the Console. See the Configuration tab for the full reference.
| Key | Type | Default | Description |
|---|---|---|---|
dpop.enabled | Boolean | false | Enable DPoP sender-bound access tokens per RFC 9449. When enabled, the Orchestrator validates DPoP proof headers and binds issued tokens to the client’s public key. |
dpop.nonce.disabled | Boolean | false | When false (the default), the Orchestrator requires a server-issued nonce in DPoP proofs. This prevents pre-generated proof replay. Set to true to disable the nonce requirement. |
DPoP provides defense against token exfiltration attacks. Even if an access token is stolen from a log, cache, or network trace, it cannot be used without the corresponding private key. For maximum security, combine DPoP with short token lifetimes and TLS for transport-level protection.
JWT and Opaque Token Options
TheaccessToken.type field controls whether the OIDC Provider issues JWT tokens or opaque (reference) tokens:
-
JWT tokens (
accessToken.type: jwt) — Self-contained tokens that include claims directly. Resource servers can validate them locally using the JWKS endpoint without calling back to the provider. This is the most common choice for APIs and modern applications. -
Opaque tokens (
accessToken.type: opaque) — Random string tokens that carry no claims. Resource servers must call the introspection endpoint to validate them. Use opaque tokens when you need to revoke tokens immediately or avoid exposing claims to intermediate services.
- Console UI
- Configuration
Per-app token type settings (JWT vs. opaque) are configured via YAML only. The Console UI manages provider-level OIDC settings (issuer, endpoints, signing keys) in the Deployment Settings dialog, but per-app access token format and lifetime are not yet available in the Console. See the Configuration tab for the full reference.
Troubleshooting
Token validation fails at the application
Token validation fails at the application
Symptoms: The application rejects tokens with “invalid signature”, “unable to verify token”, or similar errors.Causes:
- The JWKS endpoint is unreachable from the application’s network.
- A key mismatch occurred after key rotation — the application cached an old JWKS response.
- The
oidcProvider.discovery.issuerURL does not match theissclaim the application expects.
- Verify that
oidcProvider.discovery.issuermatches exactly what the application has configured as the issuer (including scheme, host, and path). - Confirm the JWKS endpoint is accessible from the application by requesting
<issuer>/.well-known/openid-configurationand following thejwks_uri. - If you recently rotated keys, ensure the active signing key is the first entry in the
jwksarray and that old keys are still present for verification of previously issued tokens.
Redirect URI mismatch
Redirect URI mismatch
Symptoms: Users see a “redirect_uri_mismatch” or “invalid redirect URI” error during the login flow.Causes:
- The redirect URL sent by the application is not listed in the app’s
redirectURLsarray. - A subtle mismatch in scheme (
httpvs.https), port, or trailing slash between the configured and requested redirect URI.
- Add the exact redirect URI (including scheme, host, port, and path) to
apps[].redirectURLsin the OIDC app configuration. - Compare the redirect URI in the browser’s address bar during the error with the configured values — they must match character-for-character.
Claims missing from tokens
Claims missing from tokens
Symptoms: The application receives a valid token but expected claims (e.g.,
email, groups) are empty or absent.Causes:- The
claimsMappingreferences a wrong connector name or attribute that does not exist on the upstream identity. - Attribute providers (
attrProviders) are not configured, so enrichment attributes are not loaded. - The upstream IdP does not return the expected attributes in its token or UserInfo response.
- Verify that connector names in
claimsMappingmatch theconnectors[].namevalues exactly. - If enrichment is needed, confirm
attrProvidersentries are configured with the correct connector names andusernameMapping. - Test the upstream IdP directly to confirm it returns the expected attributes.
IdP failover not working
IdP failover not working
Symptoms: Authentication fails when the primary IdP is down instead of falling back to a secondary IdP.Causes:
- Only one IdP is listed in
authentication.idps— there is no fallback configured. - The secondary IdP connector is misconfigured (wrong URL, expired credentials, network issue).
- Verify that multiple IdP connector names are listed in
authentication.idpsin the desired failover order. - Test each connector independently by temporarily making it the only entry to confirm it works on its own.
- Check Orchestrator logs for connector-specific error messages when failover is attempted.
Ephemeral key warning / tokens invalidated on restart
Ephemeral key warning / tokens invalidated on restart
Symptoms: All previously issued tokens become invalid after an Orchestrator restart. Logs may show a warning about ephemeral key generation.Causes:
- The
jwksarray is omitted fromoidcProvider, so the Orchestrator auto-generates an ephemeral RSA key pair on every startup. Each restart produces new keys, invalidating tokens signed with the previous keys.
- Provide explicit signing keys in the
oidcProvider.jwksarray using secret provider references (e.g.,<oidc.signingPublicKey>,<oidc.signingPrivateKey>). - Ensure both
publicKeyandprivateKeyare set for at least one entry in thejwksarray.