Configure SSO
Hook QuickZTNA to your identity provider so users sign in with their corporate credentials. Supports OIDC (most providers), SAML 2.0 (enterprise), and SCIM 2.0 for automated user provisioning. SSO is free on every plan — SCIM is Business+.
Supported providers
Anything that speaks OIDC or SAML 2.0 works. Tested with:
- Okta — OIDC + SAML + SCIM
- Microsoft Entra ID (Azure AD) — OIDC + SAML + SCIM
- Google Workspace — OIDC + SCIM (SAML via Cloud Identity)
- Auth0 — OIDC + SAML
- JumpCloud, OneLogin, Ping Identity, Keycloak — OIDC + SAML
- GitHub OAuth + Google OAuth — for developer-first teams (no SSO cost)
Generic OIDC setup
Most OIDC providers follow this pattern. Steps differ slightly per IdP.
- In your IdP, create an OIDC application (a.k.a. client).
- Set redirect URI to
https://login.quickztna.com/api/sso-auth/callback_oidc. - Note the client ID, client secret, issuer URL.
- Enable scopes:
openid email profile groups. - In QuickZTNA dashboard: Admin → SSO → Add OIDC provider. Paste client ID, secret, issuer.
- Set org slug — e.g.
acme. Users sign in viaacme.zt.netor by clicking "SSO" on the login page. - Save. Test with a user account.
$ curl https://login.quickztna.com/api/db/sso_configurations \
-H "Authorization: Bearer $QZ_API_KEY" \
-d '{
"rows": [{
"org_id": "org_9fX2kR",
"provider": "oidc",
"issuer": "https://acme.okta.com",
"client_id": "0oabcdefghijk",
"client_secret": "secret-value",
"scopes": "openid email profile groups"
}]
}' Okta — OIDC step-by-step
- Okta admin → Applications → Create App Integration
- Sign-in method: OIDC — OpenID Connect. Application type: Web Application.
- Name: "QuickZTNA". Grant types: Authorization Code.
- Sign-in redirect URI:
https://login.quickztna.com/api/sso-auth/callback_oidc - Sign-out redirect URI:
https://login.quickztna.com/auth - Assignments: groups that should have access.
- Save. Copy Client ID + Client Secret.
- Okta API → Authorization Servers → default → Claims → add
groupsclaim of type Groups with filter matching your groups. - In QuickZTNA dashboard: Admin → SSO → Add OIDC. Issuer:
https://<your-okta>.okta.com.
Microsoft Entra ID (Azure AD) — OIDC
- Entra admin → App registrations → New registration
- Name: "QuickZTNA". Supported account types: single tenant.
- Redirect URI (Web):
https://login.quickztna.com/api/sso-auth/callback_oidc - Certificates & secrets → New client secret. Copy the value immediately.
- API permissions → Microsoft Graph → email, profile, openid, User.Read, GroupMember.Read.All. Grant admin consent.
- Token configuration → Add groups claim → Security groups.
- Note Application (client) ID + Directory (tenant) ID.
- In QuickZTNA: Issuer
https://login.microsoftonline.com/<tenant-id>/v2.0.
Google Workspace — OIDC
- Google Cloud Console → APIs & Services → Credentials → Create Credentials → OAuth client ID.
- Application type: Web application.
- Authorized redirect URI:
https://login.quickztna.com/api/sso-auth/callback_oidc - Enable Admin SDK API for group membership.
- Grant domain-wide delegation for groups.
- In QuickZTNA: Issuer
https://accounts.google.com.
SAML 2.0 setup
For providers or orgs that mandate SAML over OIDC.
- In QuickZTNA dashboard: Admin → SSO → Add SAML provider. Note the Entity ID + ACS URL.
- In your IdP: create a new SAML app using those values.
- IdP → export metadata XML.
- Upload the metadata XML in QuickZTNA, or paste the SSO URL + signing cert.
- Map attributes:
NameID→ emailhttp://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress→ emailgroups→ groups (multi-value)
- Test SSO flow end-to-end.
SCIM 2.0 provisioning (Business+)
SCIM automates user lifecycle — new hires get tailnet access on day one; terminated users lose access immediately.
- QuickZTNA dashboard → Admin → SCIM → Generate bearer token. Copy immediately.
- SCIM endpoint URL:
https://login.quickztna.com/api/scim - In your IdP's SCIM config:
- Base URL: the URL above
- Bearer token: the generated token
- Supported operations: Create, Read, Update, Deactivate, Delete users; Create/Update/Delete groups
- Set attribute mappings. Minimum:
userName(email),name.givenName,name.familyName,emails[0].value. - For groups: map your IdP groups to QuickZTNA groups. QuickZTNA uses group names in ACLs.
- Enable provisioning. Test with a single user first.
Group → role mapping
Map IdP groups to QuickZTNA roles in Admin → SSO → Group mappings:
{
"acme-zt-owners": "owner",
"acme-zt-admins": "admin",
"acme-zt-members": "member",
"acme-zt-readonly": "member"
} Groups not mapped default to member. Admins can override per user from the Members page.
JIT user provisioning
If a user authenticates via SSO but doesn't exist yet in QuickZTNA, the system creates them on the fly — using the email from the ID token. Group claims determine their initial role.
Disable this if you want strict pre-provisioning: Admin → Security → JIT user provisioning off.
Adding TOTP MFA on top of SSO
SSO already enforces your IdP's MFA. If you want an extra factor at the QuickZTNA layer:
- Admin enables require_mfa org-wide
- Users enrol a TOTP authenticator (Google Authenticator, Authy, 1Password)
- Every login prompts for a 6-digit code after SSO completes
- Replay-protected (used codes cached 90s)
Troubleshooting
CSRF state cookie expired. Start fresh; don't open SSO in a new tab.
IdP not sending groups claim. Check scope includes groups (OIDC) or attribute mapping (SAML).
Wrong bearer token, or token was rotated. Regenerate in dashboard and update in IdP.
Signing cert changed. Upload new IdP metadata XML or paste new cert.
See also
- Security: authentication model — how JWTs + refresh tokens fit with SSO
- API: SSO + SCIM endpoints
- Features: identity & provisioning — what's free vs paid