Skip to main content

Sign-in providers

Route/admin/dashboard/settings
Legacy screen
This surface predates the Hive redesign; it is scheduled under #5272.

System settings holds the installation's sign-in providers — the OAuth and OpenID Connect identity providers people can use on the sign-in page and link on Linked accounts. Each provider can be configured in the database, from this screen, or in .env; a value stored here overrides the environment, and a blank field falls back to it. Sign in to the admin console and choose System settings in the sidebar.

System settings: the GitHub card enabled from the database with its secret set and a successful Validate, and the Microsoft card below itSystem settings: the GitHub card enabled from the database with its secret set and a successful Validate, and the Microsoft card below it
Route/admin/dashboard/settings

The list shows only providers that are configured — anything stored in the database for them, or a row that once existed. A provider set up purely in .env does not appear until you add it.

The providers​

ProviderIdRequired to enableExtra settings
GitHubgithubclient ID, client secretOAuth base URL, API base URL (GitHub Enterprise Server)
GitLabgitlabclient ID, client secretBase URL (self-hosted GitLab)
Microsoftazureclient ID, client secretTenant (common allows any), Authority base URL
Googlegoogleclient ID, client secretWorkspace domain — restrict sign-in to one domain
Oktaoktaclient ID, client secret, issuerIssuer
AWS (Cognito)awsclient ID, client secret, issuerIssuer (the user-pool issuer)
Keycloakkeycloakclient ID, client secret, issuerIssuer (the realm issuer)
OIDCoidcclient ID, client secret, issuerIssuer, Display name, Scopes
Auth0auth0client ID, client secret, issuerIssuer
LINElineclient ID, client secret—
VKvkclient ID, client secret—
WeChatwechatclient ID, client secret—

OIDC is any conformant OpenID provider (Authentik, PingFederate, ZITADEL and others); one generic OIDC provider is supported per installation.

Register the OAuth application​

Each provider needs an OAuth (or OIDC) application registered on its side. Its callback or redirect URI is:

<BETTER_AUTH_URL>/api/auth/oauth2/callback/<id>

where <BETTER_AUTH_URL> is the public URL of the Apiome web app and <id> is the provider's id from the table — for example https://apiome.example.com/api/auth/oauth2/callback/github. Copy the application's client ID and client secret; issuer-based providers also give you an issuer URL, such as https://acme.okta.com/oauth2/default.

Settings on the provider's side​

Apiome requests the scopes it needs itself and trusts an email address only when the provider says it is verified — a missing claim counts as unverified. A few providers need more than the callback URI:

ProviderWhere to registerWhat else to set
GitHubSettings → Developer settings → OAuth Apps → New OAuth App (or the organization's settings)Nothing — copy the client secret straight away; GitHub shows it once
GitLabSettings → Applications → Add new application (user, group or instance)Tick Confidential and the read_user scope. For a self-managed instance, set Base URL
MicrosoftEntra admin center: Identity → Applications → App registrations → New registration, platform WebCopy the secret's Value, not its ID. Add the xms_edov optional claim (Token configuration → ID token) — without it every Entra address counts as unverified and people must verify their email instead of joining their tenant. Single-tenant apps set Tenant
GoogleCloud console: APIs & Services → Credentials → OAuth client ID, type Web applicationConfigure the consent screen first (Internal for one Workspace). Workspace domain rejects any account outside that domain — the check is on the returned token, not just the sign-in page
OktaApplications → Create App Integration → OIDC → Web ApplicationAssign who may sign in. Issuer: https://<okta-domain>/oauth2/default, or /oauth2/<server-id> for a custom authorization server
AWS (Cognito)User pool: App integration → App clients, a confidential client with the authorization-code grantConfigure a Cognito domain for the Hosted UI. Issuer: https://cognito-idp.<region>.amazonaws.com/<user-pool-id>
KeycloakRealm: Clients → Create client, OpenID Connect with client authentication onMap email and email verified onto the ID token. Issuer: https://<host>/realms/<realm>
OIDCA confidential client with the authorization-code grantThe issuer must serve <issuer>/.well-known/openid-configuration and emit email and email_verified
Auth0Applications → Create Application → Regular Web ApplicationsIssuer: https://<tenant>.auth0.com, or your custom domain

The full per-provider guide — including LINE, VK and WeChat, the environment variable matrix, boot validation and secret encryption — is apiome-ui/docs/AUTH_PROVIDER_SETUP.md in the repository.

Add a provider​

  1. Click “Add Provider” at the top right.

  2. Search or scroll the list and click the provider — for example Okta.

    The Add Provider dialog searched for o, listing Google, Keycloak, OIDC and Okta with their idsThe Add Provider dialog searched for o, listing Google, Keycloak, OIDC and Okta with their ids
    Route/admin/dashboard/settings
  3. In Configure Okta, choose the Enablement:

    • Enabled — turn the provider on, using the credentials stored here;
    • Disabled — turn it off, whatever .env says;
    • Use .env — leave it to the environment variables.
  4. Enter the Client ID, the Client secret and any extra settings, such as the Issuer. Leave a field blank to fall back to .env.

  5. Click “Save”. The provider's card appears in the list.

Configure Okta: Enabled chosen, a client ID, a masked client secret and the Northwind Okta issuer filled inConfigure Okta: Enabled chosen, a client ID, a masked client secret and the Northwind Okta issuer filled in
Route/admin/dashboard/settings

Back returns to the list of providers; Cancel closes the dialog without saving.

Edit a provider​

Each card carries the same fields. Its chip says how the provider is enabled now — Enabled (database), Disabled (database) or Env-derived — and every field that has no stored value shows using .env fallback.

  • Change a field and click “Save”. Only the fields you changed are sent. A Saved note confirms it, and the footer reads Last changed … by ….
  • The client secret is write-only. The card shows only Secret: set or Secret: not set — never the value. Type a new value to replace it, or click “Clear stored secret” to remove it on the next save (the provider then uses .env); Undo cancels that.
  • Choosing “Enabled” needs every required field stored here. Values in .env do not count. If one is missing, saving is refused and the card lists what to fill in.

Changes reach the sign-in page on the next sign-in, after the configuration cache expires — within 30 seconds by default (AUTH_PROVIDER_CONFIG_CACHE_TTL_MS, 5–60 seconds). No restart is needed.

Validate a provider​

Click “Validate” to check whether the stored configuration is complete:

  • Database configuration is complete — this provider can be enabled.
  • Not ready to enable — missing: … — save the listed fields on the card first.

For OIDC, Validate also fetches the issuer's discovery document (<issuer>/.well-known/openid-configuration) and reports the error if it cannot be read, so a wrong issuer fails here rather than on the sign-in page.

Remove a provider​

Click “Remove” and then “Remove provider” to confirm. This deletes the provider's stored row — client ID, stored secret, enablement override and settings — and sign-in for the provider falls back to .env. A removed secret cannot be recovered. The provider then appears in Add Provider again.

The Microsoft card asking to confirm removal of its stored configuration, with Remove provider and CancelThe Microsoft card asking to confirm removal of its stored configuration, with Remove provider and Cancel
Route/admin/dashboard/settings

Configure in .env instead​

Every field has an environment variable in apiome-ui/.env — the console shows the variable under each extra setting. The client credentials are:

ProviderClient IDClient secret
GitHubGITHUB_IDGITHUB_SECRET
GitLabGITLAB_CLIENT_IDGITLAB_CLIENT_SECRET
MicrosoftAZURE_AD_CLIENT_IDAZURE_AD_CLIENT_SECRET
GoogleGOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET
OktaOKTA_CLIENT_IDOKTA_CLIENT_SECRET
AWS (Cognito)COGNITO_CLIENT_IDCOGNITO_CLIENT_SECRET
KeycloakKEYCLOAK_CLIENT_IDKEYCLOAK_CLIENT_SECRET
OIDCOIDC_CLIENT_IDOIDC_CLIENT_SECRET
Auth0AUTH0_CLIENT_IDAUTH0_CLIENT_SECRET
LINELINE_CLIENT_IDLINE_CLIENT_SECRET
VKVK_CLIENT_IDVK_CLIENT_SECRET
WeChatWECHAT_CLIENT_IDWECHAT_CLIENT_SECRET

apiome-ui/.env.example lists them all with their extra settings — see Operating Apiome.

With the API​

The console calls the REST API's super-admin endpoints:

  • GET /v1/admin/auth-providers — every provider's configuration, with secrets masked;
  • PUT /v1/admin/auth-providers/{provider_id} — update the fields sent;
  • DELETE /v1/admin/auth-providers/{provider_id} — remove the stored row.

See the API reference. There is no CLI command for sign-in providers.

Where next​