Overview
Single Sign-On (SSO) allows your team members to authenticate through your organization’s Identity Provider (IdP) instead of using individual Google or magic link sign-in methods. This gives your IT team centralized control over who can access Qwairy, automatic onboarding for new employees, and a single point of revocation when someone leaves. Qwairy supports OIDC (OpenID Connect) with Authorization Code + PKCE flow, the most secure and widely supported SSO protocol.SSO is available on the Enterprise plan only. See pricing or book a demo.
Supported Identity Providers
Qwairy works with any OIDC-compliant Identity Provider, including:Okta
Full OIDC support with automatic discovery
Azure AD
Microsoft Entra ID (formerly Azure Active Directory)
Google Workspace
Google Cloud Identity / Workspace
Setup Guide
Redirect URI: the examples below use
https://qwairy.co/api/auth/sso/callback. If your team signs in on a white-label custom domain, use your domain instead, e.g. https://analytics.yourcompany.com/api/auth/sso/callback. The path is always /api/auth/sso/callback. See SSO on a custom domain below. Okta
- Go to Applications > Create App Integration
- Select OIDC - OpenID Connect and Web Application
- Set the Sign-in redirect URI to:
https://qwairy.co/api/auth/sso/callback - Set Sign-out redirect URI to:
https://qwairy.co - Under Assignments, assign the app to the relevant groups
- Copy the Client ID and Client Secret
- Your Issuer URL is:
https://your-org.okta.com
Azure AD
- Go to Azure Portal > Microsoft Entra ID > App registrations > New registration
- Set Redirect URI (Web) to:
https://qwairy.co/api/auth/sso/callback - Under Certificates & secrets, create a new Client secret and copy its value
- Copy the Application (client) ID from the Overview page
- Your Issuer URL is:
https://login.microsoftonline.com/{tenant-id}/v2.0
Google Workspace
- Go to Google Cloud Console > APIs & Services > Credentials > Create OAuth client ID
- Select Web application
- Add Authorized redirect URI:
https://qwairy.co/api/auth/sso/callback - Copy the Client ID and Client Secret
- Your Issuer URL is:
https://accounts.google.com
acme.com)Click Test OIDC Connection to verify that Qwairy can reach your IdP’s discovery endpoint and JWKS. This validates the issuer URL without performing a full login.
Domain Verification
Domain verification proves that your organization owns the email domain you want to use for SSO. This prevents unauthorized teams from claiming your domain. When you add a domain, Qwairy generates a unique verification token. You add this as a DNS TXT record:Each domain can only be linked to one team. If you see “domain already claimed”, contact support.
JIT Provisioning
Just-In-Time (JIT) provisioning automatically creates user accounts when team members sign in via SSO for the first time. When a user authenticates through your IdP:- Qwairy receives their email, name, and profile picture from the OIDC claims
- If the user doesn’t exist, a new account is created automatically
- The user is added to your team with the Default Role you configured (Member or Viewer)
- If the user already exists (e.g., from a previous invitation), they are linked to your SSO connection
SSO on a Custom Domain
If your team uses a white-label custom domain (e.g.analytics.yourcompany.com), your users sign in on that domain, so the SSO callback runs there too. Register the redirect URI for your domain in your IdP:
Teams without a custom domain use
https://qwairy.co/api/auth/sso/callback. You can register both your custom domain and the Qwairy URI in your IdP if you sign in from both.Enforce SSO
When Enforce SSO is enabled, team members with email addresses matching your verified domains are required to sign in through your IdP. Google sign-in and magic links are blocked for these users. To enable enforcement:- Ensure SSO is enabled and working
- Toggle Enforce SSO in Team Management > SSO settings
- Non-SSO sign-in attempts from your domain will be redirected to the SSO login
Troubleshooting
Discovery failed
Discovery failed
- Verify the Issuer URL is correct and accessible
- Ensure the URL points to the OIDC provider root (e.g.,
https://accounts.google.com, nothttps://accounts.google.com/.well-known/openid-configuration) - Check that your IdP is not blocking external requests
Invalid redirect URI / redirect_uri_mismatch
Invalid redirect URI / redirect_uri_mismatch
- Ensure your IdP has the redirect URI for your Qwairy domain:
https://qwairy.co/api/auth/sso/callback, orhttps://your-custom-domain/api/auth/sso/callbackif you use a white-label custom domain - The URL must match exactly, including the protocol (
https) and the/api/auth/sso/callbackpath
Domain not verified
Domain not verified
- Verify the DNS TXT record is set on the correct domain
- DNS propagation can take up to 48 hours — try again later
- Use a DNS lookup tool to confirm the TXT record is visible
User not provisioned
User not provisioned
- Ensure the user’s email domain matches a verified SSO domain
- Check that the IdP is returning the
emailclaim in theid_token - Verify the
openid email profilescopes are configured in your IdP
Security
Qwairy’s SSO implementation follows security best practices:| Measure | Detail |
|---|---|
| PKCE (S256) | Code verifier stored server-side, never exposed to the client |
| State parameter | CSRF protection with cryptographically random state, 10-minute TTL |
| Nonce validation | Prevents token replay attacks |
| Client secret encryption | AES-256-GCM encrypted at rest |
| DNS verification | Prevents unauthorized domain claiming |
| One-time tokens | 60-second TTL, single use for session bridging |

