Directory
Enterprise SSO
Camper’s dashboard can authenticate operators through your corporate IdP. This is sign-in, not directory provisioning.
| Concern | Mechanism |
|---|---|
| Who exists / org chart / roles | SCIM |
| How they open the dashboard | SSO (this page), email OTP, password, passkeys, Google |
OIDC vs SAML
Camper supports both OpenID Connect and SAML 2.0.
| OIDC (recommended) | SAML 2.0 | |
|---|---|---|
| Best for | New Okta / Entra / Google apps | When IT policy or IdP app type requires SAML |
| Setup | Issuer + client ID/secret + redirect URI | Metadata XML or SSO URL + signing cert |
| Day-2 | Simple secret rotation | Cert / metadata lifecycle |
Recommendation: use OIDC unless your security team or IdP only offers SAML. Neither protocol replaces SCIM for directory and roles.
Supported protocols
- OIDC — Okta, Entra ID, Google Workspace, Auth0, …
- SAML 2.0 — same IdPs via metadata XML or SSO URL + cert
Configure (tenant admin)
- Open Settings → Identity Providers.
- Add provider — prefer the OIDC templates (Okta, Entra, Google); use SAML 2.0 only when required.
- The guided form asks for what your IdP gives you (e.g. Okta domain + client credentials). Copy the shown redirect URI / ACS URL into your IdP app. Claim the email domain (e.g.
acme.com). - Publish the DNS TXT verification token, then Verify:
- Host (name):
_{prefix}-{provider-id}as a subdomain of the claimed domain - Value: the token string Camper shows (bare token is enough)
- Host (name):
- Until the domain is verified, sign-in through that IdP is blocked.
The prefix is environment-specific so prod and dev can claim the same email domain without fighting over one TXT record:
| Environment | DNS host example (getcamper.io + getcamper-io-okta) |
|---|---|
Production (app.getcamper.io) | _better-auth-token-getcamper-io-okta.getcamper.io |
| Dev / local | _better-auth-token-dev-getcamper-io-okta.getcamper.io |
Always copy the host Camper shows in the prompt — do not invent the name.
The TXT is not on the apex alone. Override the prefix with
CAMPER_SSO_DOMAIN_TOKEN_PREFIXonly if you need a custom segment.
Callback URLs are under the Camper auth base (/api/auth/sso/…). OIDC redirect URI is returned on register; SAML ACS is /api/auth/sso/saml2/sp/acs/{providerId}.
OIDC discovery hosts
Camper allowlists common public IdP discovery hosts (Okta, Okta Preview, Entra, Google) so registration can fetch /.well-known/openid-configuration. If you use a private or custom OIDC issuer and registration fails with Untrusted OIDC discovery URL, ask your Camper operator to add that issuer’s origin to CAMPER_TRUSTED_ORIGINS (comma-separated, e.g. https://idp.corp.example).
Enforce SSO
After at least one domain is verified:
- Turn on Require SSO for claimed domains.
- OTP, password, passkeys, and Google social are blocked for emails on those domains.
- Users must Continue with SSO (Camper routes by domain).
Break-glass accounts
When enforcement is on, pick break-glass members (tenant operators) who may still use email code / password if the IdP is unavailable. Prefer a small set of owner/admin accounts. Break-glass is per platform user (email), not a shared password vault.
Enforcement is enforced server-side, not only in the login UI.
Sign-in flow
- On the login page, enter a work email on a claimed domain.
- Choose Continue with SSO (or submit email when SSO is enforced — Camper starts SSO automatically).
- Camper matches the email domain to the verified provider and redirects to the IdP.
- After assertion / token exchange, you land on the dashboard with a normal Camper session.
OTP, password, passkeys, and Google remain available for domains without enforcement, and for break-glass users when enforcement is on.
JIT vs SCIM
First-time SSO can create a platform user and attach them as a member of the tenant linked to the provider. Prefer SCIM provisioning so people and roles exist before first login — JIT is the fallback.
Universal Logout (Okta)
If you use Okta, registering the OIDC client also enables Universal Logout: Okta can POST to Camper’s Global Token Revocation endpoint and clear that user’s dashboard sessions without deprovisioning them. See Okta setup → Universal Logout.