Skip to content

OIDC Authentication Configuration

  • Self-hosted

This guide explains how to configure OpenID Connect (OIDC) authentication for a self-hosted Qualytics deployment. OIDC is the recommended authentication method for self-hosted deployments because it integrates directly with your enterprise Identity Provider (IdP). It can support environments without public internet egress when the Qualytics application and your users can reach the required IdP endpoints through approved network paths.

Overview

When configured for OIDC, Qualytics authenticates users directly against your organization's Identity Provider using the OpenID Connect protocol. This means:

  • No Qualytics-hosted authentication dependency: Authentication is handled by your IdP.
  • Your IdP governs access: User login requirements, MFA, and password policies are enforced by your IdP.
  • Private-network support: OIDC can work without public internet access when the IdP endpoints are available inside or reachable from the environment.
sequenceDiagram
    participant User
    participant Qualytics
    participant IdP as Your Identity Provider

    User->>Qualytics: Access Qualytics UI
    Qualytics->>IdP: Redirect to IdP login
    IdP->>User: Prompt for credentials
    User->>IdP: Authenticate
    IdP->>Qualytics: Return authorization code
    Qualytics->>IdP: Exchange code for tokens
    Qualytics->>IdP: Fetch user info
    Qualytics->>User: Set session cookies & redirect to UI

Network Prerequisites

Before configuring OIDC, confirm the following network paths:

  • User browsers can reach the IdP authorization endpoint.
  • The Qualytics application can reach the discovery, token, user information, and JWKS endpoints used by your IdP.
  • The application trusts the TLS certificates presented by those endpoints.

An environment without public internet access can use OIDC when these endpoints are available through private or internal network routes.

Supported Identity Providers

Any OIDC-compliant Identity Provider is supported, including:

  • Microsoft Entra ID (Azure Active Directory)
  • Okta / Okta Workforce Identity
  • Google Workspace
  • Keycloak
  • OneLogin
  • PingFederate
  • ForgeRock
  • Active Directory Federation Services (ADFS)

Step 1: Register Qualytics in Your IdP

Before configuring Qualytics, you need to register it as an application in your Identity Provider.

Application Registration Settings

Setting Value
Application type Web application
Grant type Authorization Code
Redirect URI https://<your-qualytics-domain>/api/callback
Scopes openid, email, profile (at minimum openid)
Token endpoint auth method Client secret POST or Basic, as required by your IdP
Back-channel logout URL (optional) https://<your-qualytics-domain>/api/backchannel-logout

After registration, your IdP will provide:

  • A Client ID
  • A Client Secret
  • A Discovery URL (typically https://<your-idp-domain>/.well-known/openid-configuration)

Back-Channel Logout

When your IdP sends a supported back-channel logout notification, Qualytics deactivates that user account.

Step 2: Configure Qualytics

Set global.authType to OIDC in your Helm values.yaml file and provide the OIDC configuration under secrets.oidc.

Every installation must also keep its Qualytics-provided deployment identifier under secrets.deployment.identifier. The identifier is separate from your OIDC credentials, image registry token, and platform license. See the Self-Hosted Deployment Guide for secure handling requirements.

The simplest way to configure OIDC is to provide a Discovery URL. Qualytics will automatically fetch your IdP's .well-known/openid-configuration document and populate the authorization, token, userinfo, JWKS, and issuer endpoints for you.

For OIDC authentication, a discovery URL reduces the required configuration to four values. Other installation requirements, including the deployment identifier, still apply.

Helm Value Description Example
secrets.oidc.oidc_discovery_url IdP's OpenID Connect discovery endpoint https://your-org.okta.com/.well-known/openid-configuration
secrets.oidc.oidc_client_id OAuth2 client ID from your IdP 0oabc123def456
secrets.oidc.oidc_client_secret OAuth2 client secret from your IdP (secret value)
secrets.auth.jwt_signing_secret Secret for signing JWTs (minimum 32 characters) (generate with openssl rand -base64 32)

Set global.authType: "OIDC" in your values.yaml. Scopes, claim mappings, and endpoints have defaults that work with most IdPs.

Common Discovery URLs

Identity Provider Discovery URL
Okta https://{your-domain}.okta.com/.well-known/openid-configuration
Microsoft Entra ID https://login.microsoftonline.com/{tenant-id}/v2.0/.well-known/openid-configuration
Google Workspace https://accounts.google.com/.well-known/openid-configuration
Keycloak https://{host}/realms/{realm}/.well-known/openid-configuration

Discovery URL auto-discovers 5 endpoints

When oidc_discovery_url is set, the following fields are fetched automatically at startup and do not need to be configured:

  • oidc_authorization_endpoint
  • oidc_token_endpoint
  • oidc_userinfo_endpoint
  • JWKS URI (for back-channel logout token verification)
  • Issuer (for back-channel logout token validation)

These fields default to empty strings ("") and are not injected into the deployment when left empty. When discovery returns a value, Qualytics uses the discovered value. An individually configured endpoint is used only when the discovery document omits that field.

Manual Endpoint Configuration (Fallback)

If your IdP does not support a standard discovery URL, or if the discovery endpoint is not reachable from your cluster, omit oidc_discovery_url and configure endpoints individually instead:

Helm Value Description Example
global.authType Authentication mode; must be OIDC OIDC
secrets.oidc.oidc_client_id OAuth2 client ID from your IdP 0oabc123def456
secrets.oidc.oidc_client_secret OAuth2 client secret from your IdP (secret value)
secrets.oidc.oidc_authorization_endpoint IdP's authorization URL https://login.example.com/oauth2/authorize
secrets.oidc.oidc_token_endpoint IdP's token exchange URL https://login.example.com/oauth2/token
secrets.oidc.oidc_userinfo_endpoint IdP's user info URL https://login.example.com/oauth2/userinfo
secrets.auth.jwt_signing_secret Secret for signing JWTs (minimum 32 characters) (generate with openssl rand -base64 32)

JWT Signing Secret

The jwt_signing_secret must be at minimum 32 characters long. Changing this value will invalidate all active user sessions.

Redirect URL

The OAuth2 callback URL is automatically set to https://<global.dnsRecord>/api/callback. Ensure this matches the redirect URI registered in your IdP.

Optional Settings

OIDC Scopes and Behavior

Helm Value Default Description
secrets.oidc.oidc_scopes openid,email,profile Comma-separated OAuth2 scopes
secrets.oidc.oidc_token_auth_method Auto-detected Token endpoint authentication method; set client_secret_basic or client_secret_post only when required by your IdP
secrets.oidc.oidc_jwt_ttl_minutes Platform default Session lifetime in minutes; omit this value unless you need an explicit override
secrets.oidc.oidc_allow_insecure_transport false Allow HTTP for IdP endpoints; use only in development
secrets.oidc.oidc_signer_pem_url "" URL to a custom CA certificate PEM for IdP token validation

Claims Mapping

All claim keys default to standard OIDC claim names and work out of the box with most IdPs. You only need to override these if your IdP uses non-standard claim names:

Helm Value Default Qualytics Field
secrets.oidc.oidc_user_id_key sub User ID
secrets.oidc.oidc_user_email_key email Email address
secrets.oidc.oidc_user_name_key name Display name
secrets.oidc.oidc_user_fname_key given_name First name
secrets.oidc.oidc_user_lname_key family_name Last name
secrets.oidc.oidc_user_picture_key picture Profile picture URL
secrets.oidc.oidc_user_provider_key iss Identity provider name
secrets.oidc.oidc_user_groups_key groups IdP group names used for optional Team mapping

Optional IdP Group Mapping to Teams

Qualytics can add users to existing Teams based on an IdP group claim at sign-in. This is disabled by default because Team membership can grant access to data.

Helm Value Default Description
secrets.oidc.oidc_user_groups_key groups The claim that holds the user's group listing
secrets.oidc.oidc_group_team_sync_enabled false Whether matching group names add Team membership
secrets:
  oidc:
    oidc_user_groups_key: "<verified group claim>"
    oidc_group_team_sync_enabled: true

Before enabling it, confirm the exact claim name and values emitted by your IdP. Some providers require an additional scope before they include groups in the token or user information response, and several send group identifiers rather than group names. Membership is add-only, so removing a user from an IdP group does not remove them from the matching Team.

For claim setup per Identity Provider, Team naming, verification, and the routine that keeps membership accurate over time, see Just-in-Time Provisioning and Group Sync.

Environment Variable Reference

The Helm values on this page are the supported configuration interface. Do not add authentication environment variables directly to the application workloads, because their internal mapping can change between chart versions. For advanced troubleshooting, provide your approved chart version and a redacted copy of the relevant Helm values to Qualytics Support.

This example uses the default scopes, claim mappings, and endpoints. Merge these authentication settings into the complete protected configuration supplied for your installation.

global:
  dnsRecord: "qualytics.example.com"
  authType: "OIDC"

secrets:
  deployment:
    identifier: "<provided by Qualytics>"
  oidc:
    oidc_discovery_url: "https://your-org.okta.com/.well-known/openid-configuration"
    oidc_client_id: "your-client-id"
    oidc_client_secret: "your-client-secret"
  auth:
    jwt_signing_secret: "your-secure-random-string-min-32-chars"

Example values.yaml: Manual Endpoints (Fallback)

Use this approach only if your IdP's discovery endpoint is not reachable from your cluster:

global:
  dnsRecord: "qualytics.example.com"
  authType: "OIDC"

secrets:
  deployment:
    identifier: "<provided by Qualytics>"
  oidc:
    oidc_client_id: "your-client-id"
    oidc_client_secret: "your-client-secret"
    oidc_scopes: "openid,email,profile"
    oidc_authorization_endpoint: "https://login.example.com/oauth2/authorize"
    oidc_token_endpoint: "https://login.example.com/oauth2/token"
    oidc_userinfo_endpoint: "https://login.example.com/oauth2/userinfo"
  auth:
    jwt_signing_secret: "your-secure-random-string-min-32-chars"

Step 3: Deploy or Restart

If this is a new deployment, follow the Self-Hosted Deployment Guide to deploy Qualytics.

If you are updating an existing deployment's authentication configuration, apply the changes:

CHART_VERSION="<version provided by Qualytics>"

helm upgrade qualytics qualytics/qualytics \
  --namespace qualytics \
  --version "$CHART_VERSION" \
  -f values.yaml \
  --wait \
  --timeout=20m

Use the complete protected values.yaml file that contains the installation's existing deployment identifier. Do not pass the identifier with --set, because command arguments can be stored in shell history and process logs.

Step 4: Verify Authentication

  1. Navigate to your Qualytics instance in a browser (e.g., https://qualytics.example.com)
  2. You should be redirected to your IdP's login page
  3. Authenticate with your IdP credentials
  4. After successful authentication, you should be redirected back to the Qualytics UI

Security Architecture

Qualytics implements a three-tier security model for OIDC authentication:

Tier 1: HttpOnly Cookies + CSRF Protection

  • Session JWTs are stored in HttpOnly cookies (not accessible to JavaScript)
  • CSRF protection uses a double-submit cookie pattern
  • SameSite=Lax cookie attribute prevents cross-site request forgery

Tier 2: Token Fingerprinting

  • A random fingerprint is embedded in the JWT and stored in a separate HttpOnly cookie
  • Prevents stolen JWT replay because an attacker needs both the JWT and the fingerprint cookie
  • Session lifetime can be set with secrets.oidc.oidc_jwt_ttl_minutes; automatic session refresh is supported

Tier 3: DPoP (Demonstration of Proof-of-Possession)

  • The browser generates a non-extractable ECDSA key pair
  • The JWT is cryptographically bound to the key pair
  • Each API request includes a signed proof, so a stolen JWT is useless without the private key

CLI Authentication

Run the CLI authentication flow:

qualytics auth login --url https://qualytics.example.com

Replace the example URL with your Qualytics deployment URL. The CLI opens your browser and uses your active Qualytics session to confirm your identity. If no active session is available, sign in to Qualytics in the browser. When the browser-based flow is unavailable, the authorization page provides a manual token fallback.

Troubleshooting

Symptom Likely Cause Solution
OIDC discovery or sign-in cannot start An IdP endpoint is unreachable Confirm the application and user browsers can reach the required IdP endpoints through the approved network paths
401 error after IdP login Redirect URI mismatch Ensure the redirect URI registered in your IdP exactly matches https://<global.dnsRecord>/api/callback
Sign-in returns to the login page Browser session did not complete Sign out of Qualytics, close duplicate Qualytics tabs, and sign in again. Contact Qualytics Support if the issue continues
Sessions expire too quickly Configured session lifetime is too short Set secrets.oidc.oidc_jwt_ttl_minutes to the required number of minutes, then apply the updated values
User deactivated after IdP logout Back-channel logout working correctly This is expected behavior; contact Qualytics Support if the deactivation was unintended
User is not added to a Team Group claim or Team name does not match Confirm the configured group claim is present and that its value matches an existing Team name; matching is case-insensitive. See Just-in-Time Provisioning and Group Sync
SSL certificate errors Self-signed or private CA certificates Set secrets.oidc.oidc_signer_pem_url to your CA certificate URL in your values.yaml

Need Help?

Contact your Qualytics account manager for assistance with OIDC configuration.