Char validates tokens on behalf of your application. You configure your application’s OIDC client ID in the Char dashboard. Char then validates that incoming tokens were issued for your application—ensuring only your users can access your agent, not users from other applications in your IDP.
How It Works
User authenticates with your IDP
When a user accesses your application, they authenticate through your existing identity provider (Okta, Azure AD, Auth0, Google, or any OIDC provider).
Your app receives a JWT token
Your IDP issues a signed JWT token containing the user’s identity (
sub claim) and other claims.Agent validates the token
When initializing the Char agent, pass the user’s JWT token. Char validates the token against your IDP’s public keys (JWKS) and extracts the user identity.
Supported Identity Providers
Okta
Enterprise identity management with Okta Identity Cloud
Azure AD
Microsoft Entra ID (formerly Azure Active Directory)
Auth0
Flexible authentication platform by Okta
Google Workspace
Google Workspace and Google Cloud Identity
WorkOS
WorkOS User Management and AuthKit
AWS Cognito
Amazon Cognito User Pools for AWS applications
Firebase Auth
Firebase Authentication for web and mobile apps
Clerk
Developer-focused authentication platform
Scalekit
Full Stack Auth, SSO, SCIM, and MCP Auth
Better Auth
Open-source TypeScript auth framework
Logto
Open-source OIDC platform for SaaS and AI apps
Keycloak
Open-source identity and access management
OneLogin
Enterprise identity management platform
Ping Identity
PingOne and PingFederate integration
Custom OIDC
Any OpenID Connect compliant provider
Security Model
Char’s SSO integration is built on security best practices:| Feature | Implementation |
|---|---|
| Token validation | Asymmetric signature verification using IDP’s public keys (JWKS) |
| Issuer validation | Tokens must come from the configured IDP’s issuer URL |
| Audience validation | Tokens must include your configured client ID in the aud claim |
| No shared secrets | Only public key cryptography - no client secrets stored |
| Token handling | Tokens are validated, claims extracted, then discarded - never persisted |
Configuration Overview
Every IDP requires:- Provider Type: Select your IDP (Okta, Azure AD, Auth0, Google, WorkOS, or Custom OIDC)
- Client ID: Your OIDC application’s client ID (used for audience validation)
- Domain/Issuer: Provider-specific identifier (see details below)
- Allowed Domains: Origins where your agent can be embedded
Okta
Okta
Enter your Okta domain without the
https:// prefix.Example: acme.okta.com or acme.oktapreview.comChar constructs the issuer URL as https://{domain} and fetches JWKS from the standard discovery endpoint.Azure AD / Microsoft Entra ID
Azure AD / Microsoft Entra ID
Enter your tenant ID or primary domain.Example:
contoso.onmicrosoft.com or 12345678-1234-1234-1234-123456789abcChar constructs the issuer URL as https://login.microsoftonline.com/{tenant}/v2.0.Auth0
Auth0
Enter your Auth0 domain without the
https:// prefix.Example: acme.auth0.com or acme.us.auth0.comChar constructs the issuer URL as https://{domain}/ (trailing slash required by Auth0).Google Workspace
Google Workspace
No domain configuration needed. Google uses a fixed issuer URL.Just provide your OAuth Client ID from the Google Cloud Console.
WorkOS
WorkOS
Enter the full issuer URL from your WorkOS dashboard.Example:
https://api.workos.com/sso/authorize/conn_...Scalekit
Scalekit
Enter your Scalekit environment URL as the issuer.Example:
https://your-app.scalekit.comChar discovers the JWKS endpoint from {environment_url}/.well-known/openid-configuration.Better Auth
Better Auth
Enter your Better Auth base URL as the issuer.Example:
https://auth.yourapp.comRequires OIDC Provider and JWT plugins. JWKS endpoint is at /api/auth/jwks.Logto
Logto
Enter your Logto endpoint followed by
/oidc.Example: https://your-tenant.logto.app/oidcChar discovers the JWKS endpoint from {endpoint}/oidc/.well-known/openid-configuration.Custom OIDC
Custom OIDC
Enter the complete issuer URL for your OIDC provider.Example:
https://auth.example.com/realms/mainChar appends /.well-known/openid-configuration to discover endpoints.Agent Integration
Once your IDP is configured, pass the user’s JWT token to the agent using theconnect() method:
Alternative: SSR Applications
For server-side rendered applications (Next.js, Remix, Rails, Django), you may not have access to the JWT client-side. Instead, exchange your IDP token for a short-lived ticket server-side, then pass it to the client. Tickets let your backend validate users with your existing auth system, then create a short-lived, single-use ticket without exposing your IDP’s JWT to the client.SSR Authentication Guide
Learn how to embed the agent in server-rendered applications using ticket exchange
Testing Your Configuration
The Char dashboard includes a Test Connection feature that verifies your IDP configuration by fetching the OIDC discovery document. This confirms:- The IDP is accessible
- The discovery document is valid
- The JWKS endpoint is available

