Sign-in & SSO
Verify your domains, connect a SAML identity provider, restrict how members sign in, and confirm it's you before sensitive changes
Fruxon has no passwords. People sign in to the console with Google, Microsoft, or GitHub, with a six-digit code sent to their email, or through their company's identity provider. A workspace controls that with these settings:
| Control | Where | Plan | Who can change it |
|---|---|---|---|
| Domains | Settings → Domains | Every plan | Owners and Admins |
| Single sign-on | Settings → Single sign-on | Enterprise | Owners and Admins, from a console session |
| Sign-in methods | Settings → Sign-in methods | Every plan | Owners and Admins, from a console session |
| Confirm it's you | A prompt before sensitive changes | Every plan | Applies to everyone |
| Sign out everywhere | API only | Every plan | Each person, for their own sessions |
"From a console session" means an API token is refused with 403, even one with workspace:write. Domains can also be managed with a token that has workspace:write. The workspace routes on this page live under /v1/tenants/{tenant}, written … below.
How people sign in
The sign-in page offers Continue with Google, Continue with Microsoft, Continue with GitHub, Continue with email, and Continue with SSO. Google One Tap appears on arrival and counts as a Google sign-in. Continue with email sends a six-digit code. Continue with SSO asks for a Work email and sends the person to their company's identity provider.
If someone enters an address on a domain that signs in through SSO, on the sign-in page or the sign-up page, Fruxon sends them to the identity provider instead of emailing a code. That keeps people on SSO by default, but it doesn't stop them choosing Google instead. To close the other ways in, use Sign-in methods.
Domains
Verifying a domain proves your company controls it. It grants nothing on its own. Single sign-on builds on it: Fruxon trusts your identity provider only about addresses on domains you've verified.
- Open Settings → Domains, enter the domain (for example
acme.com), and click Add domain. - At your DNS provider, publish the TXT record the page shows. Type is
TXT. Name is the domain itself, which many DNS consoles write as@. Value starts withfruxon-domain-verification=. - Click Verify. Fruxon looks the record up through a public resolver. If DNS hasn't caught up yet, nothing changes, so try again in a minute.
Leave the record published after the domain is verified. Fruxon re-checks every verified domain daily.
| Status | Meaning | For single sign-on |
|---|---|---|
| Pending | Added. The record hasn't been found yet. | Can't be attached |
| Verified | The record was found | Can be attached. Signs people in, and auto-join works. |
| Lapsed | The record has been missing for 7 days in a row. Finding it again, by the daily check or Verify, makes it Verified again. | Still signs people in. Auto-join is paused. |
| Suspended | Still missing 14 days after lapsing. Only Verify brings it back. | Detached from the connection. Verifying it again doesn't attach it again. |
| Released | 30 days after suspension. Kept as history only. | Detached. Claim again starts over with a new record. |
Owners get an email when a domain lapses, 3 days before it's suspended, and when it's suspended. The email links to Settings → Domains with ?workspace= set to the workspace's slug, so the link opens the right workspace even for people who belong to several. The page's heading names the workspace for the same reason.
- Each subdomain is its own claim. Verifying
acme.comdoesn't covereng.acme.com. - Personal and disposable email domains, and Fruxon's own domains, can't be claimed. A workspace can hold up to 50 claims.
- Any number of workspaces can verify the same domain, each with its own TXT record. Add your record next to theirs, and don't replace theirs.
- Remove gives the domain up for this workspace at once, and detaches it from single sign-on.
In the API, the routes are GET …/domains, POST …/domains with a domain field, POST …/domains/{domain}:verify, and DELETE …/domains/{domain}. Here {domain} is the claim's id, not the domain name. Each claim can be checked once every 10 seconds. Checking sooner returns 429.
Single sign-on
Single sign-on lets people sign in through your company's SAML 2.0 identity provider, such as Okta or Microsoft Entra ID. It's part of the Enterprise plan. A workspace has one connection. Nobody signs in through it until you've tested it and turned it on.
To start, open Settings → Single sign-on, fill in Identity provider name (for example Okta), and click Set up single sign-on. The sign-in page shows this name, as in "Sign in with Okta". The page then walks you through four steps.
1. Create a SAML app in your identity provider
Copy the two values the page shows into a new SAML app:
| On the page | Okta | Microsoft Entra ID |
|---|---|---|
ACS URL, https://auth.fruxon.com/__/auth/handler | Single sign-on URL | Reply URL |
SP entity ID, urn:fruxon:sso:fx-… | Audience URI | Identifier (Entity ID) |
In the app, send each person's email address in an attribute named email. For the NameID, use a persistent identifier, not the email address. Then a person whose address changes keeps the same Fruxon account.
2. Add your identity provider's SAML metadata
Choose Metadata URL or Paste XML, then click Save metadata. For a URL, use the app's Metadata URL in Okta, or the App Federation Metadata Url in Entra ID. Fruxon fetches the URL once, when you save, and doesn't fetch it again later.
Each save creates a new numbered revision. The page lists the revision's identity provider, its sign-in URL, and its signing certificates with their expiry dates. A certificate that expires within 30 days gets a warning. Fruxon refuses metadata that has no signing certificate, an expired certificate, more than two certificates, or a sign-in URL that doesn't use https.
A saved revision reaches the identity platform within a few seconds. Until then it shows Applying…. Then it shows Applied, or Couldn't apply with the reason. To retry a failed revision, save it again.
3. Attach your domains
Pick a domain under Verified domain and click Attach domain. Only people with an address on an attached domain can sign in through the connection, and the address must be on that exact domain. You can attach only domains that are Verified under Domains.
A domain can be attached to only one workspace's single sign-on. If another workspace has already attached it, you get SSO_DOMAIN_ATTACHED_ELSEWHERE. If the domain belongs to your company, contact support.
4. Test and turn on
Click Test sign-in. In the window that opens, sign in as yourself with an address on an attached domain. The test doesn't sign anyone in or change anything. It only records that this revision works. You have 10 minutes to finish it, and only the admin who started a test can complete it.
When the test passes, click Turn on single sign-on. After a few seconds the connection shows On.
Change the configuration later
When your identity provider rotates its certificate, or you change the app, click Replace metadata. The new revision goes only to a test configuration. Everyone keeps signing in with the live revision, and the page tells you which revision that is. Test the new revision, then click Switch to revision N. Only the latest revision can be turned on, and only after it passes a test.
Who gets in
Signing in through SSO signs a person in to Fruxon. The Joining the workspace card decides whether they also join the workspace:
| Situation | What happens |
|---|---|
| Already a member | They're signed in to the workspace. |
| There's an open invitation to the address the identity provider sent | They accept the invitation and get its role. This works with auto-join on or off. |
| Let people join without an invitation is on, and the address is on a Verified attached domain | They join with the role under They join as: Viewer, Operator, Developer (the default), or Admin. Auto-join never grants Owner. |
| Auto-join is on, but the domain is Lapsed | They don't join until the domain is verified again. |
| Auto-join is off, and there's no invitation | They're signed in but not joined. The page says You're signed in and tells them to ask an admin for an invitation. |
Auto-join stops when the workspace reaches its member limit. If someone has no Fruxon account yet, their first SSO sign-in creates one. They're asked to accept Fruxon's terms the first time the console opens.
Existing members. Turning SSO on changes nothing for current members. When a member first signs in through SSO with the same email address, they get their existing Fruxon account, with their memberships and tokens. Their other sign-in methods keep working unless you restrict them under Sign-in methods.
Starting from your identity provider. To add Fruxon as an app tile in your identity provider, point the tile at https://app.fruxon.com/sso/<workspace-slug>. That page offers Continue with followed by your identity provider's name. If the browser blocks the sign-in window, Fruxon redirects the whole page instead.
You can't require single sign-on for your domains yet. The API refuses requireSso: true. Until that's available, use SSO together with Sign-in methods to keep members from signing in other ways.
Remove access
Removing a person in your identity provider stops them signing in through it. It doesn't end a Fruxon session they already have, remove them from the workspace, or turn off their other sign-in methods. To do that, also remove them under Settings → Team management (see Team & Roles).
Detach stops sign-ins for addresses on that domain at once. Delete connection stops all sign-ins through the connection, detaches its domains, and deletes it. In both cases members stay in the workspace, and sessions that already started stay valid until they end. If you set SSO up again later, you start over with a new app in your identity provider.
If the workspace leaves the Enterprise plan, it can still see its connection, detach domains, and delete the connection. It can't make other changes.
API
| Step | In the console | API |
|---|---|---|
| Read | — | GET …/ssoConnection |
| Create | Set up single sign-on | POST …/ssoConnection with displayName |
| Save metadata | Save metadata | POST …/ssoConnection/revisions with metadataUrl or metadataXml |
| Test | Test sign-in | POST …/ssoConnection:startTest, then POST …/ssoConnection:completeTest with the nonce and the sign-in's idToken |
| Turn on or switch | Turn on single sign-on | POST …/ssoConnection:promote |
| Attach or detach | Attach domain · Detach | POST …/ssoConnection/domains with domainClaimId · DELETE …/ssoConnection/domains/{domain} |
| Joining | Joining the workspace | GET …/ssoPolicy · PUT …/ssoPolicy |
| Delete | Delete connection | DELETE …/ssoConnection |
PUT …/ssoPolicy replaces the whole policy: jitEnabled, jitRole, and requireSso, which must be false. Each change is recorded in the workspace's audit log.
Sign-in methods
Settings → Sign-in methods controls how members may sign in to reach the workspace. The options are Google, Microsoft, GitHub, Email code, and Single sign-on. Every method is allowed until you save a shorter list. For example, a company that enforces MFA at its identity provider can allow only Single sign-on, so nobody gets in without MFA.
When a member's session was started with a method that isn't allowed, their next request is refused with 403 sign_in_method_not_allowed. The console hides the workspace behind a prompt such as "Sign in with Google or Microsoft to open Acme", with Sign in again and, for members of other workspaces, Switch workspace. A change applies everywhere within 30 seconds.
These rules keep you from locking yourself out:
- At least one method must stay on.
- The method you're signed in with must stay on. To remove it, sign in again with another method first.
- Selecting every method removes the restriction.
API tokens aren't affected. Personal tokens and service accounts keep working under their own scopes and expiry. Changing the list asks you to confirm it's you. In the API, use GET …/signInPolicy and PUT …/signInPolicy. The PUT takes allowedMethods, a list of EMAIL, GOOGLE, MICROSOFT, GITHUB, and SSO.
Single sign-on allows a sign-in through any workspace's SSO connection, just as Google allows any Google account. Fruxon also lets you delete your connection or detach a domain while this list allows only Single sign-on, and a suspended domain is detached automatically. Add another method back before you delete or detach anything. Otherwise members on that domain can't start a session that reaches the workspace.
Confirm it's you
Some changes do lasting damage if someone uses a stolen session to make them. Before these changes, Fruxon asks you to confirm it's you when you signed in more than 15 minutes ago.
The console shows Confirm it's you with the way you signed in: Continue with Google (or Microsoft or GitHub), Email me a code if you signed in with an email code, or Continue with your identity provider's name for an SSO session. After you confirm, the change goes through, and you don't have to start it again. If your sign-in method can't confirm you, the dialog offers Sign in again, and you come back to the same page afterwards.
| Action | API |
|---|---|
| Create or rotate a personal token | POST …/tokens:generate · POST …/tokens/{token}:rotate |
| Create a service account, or rotate its token | POST …/serviceAccounts · POST …/serviceAccounts/{serviceAccount}:rotate |
Approve a fruxon login from the CLI | POST …/deviceAuthorizations/{userCode}:approve |
| Change a member's role, including Make owner and Remove owner | PATCH …/users/{user} |
| Remove a member | DELETE …/users/{user} |
| Delete the workspace | DELETE /v1/tenants/{tenant} |
| Stage, activate, or offboard customer-managed encryption keys | POST …/byok:stage · POST …/byok:activate · POST …/byok:offboard |
| Change data retention | PUT …/dataRetention |
| Change sign-in methods | PUT …/signInPolicy |
| Turn SSO on or switch its revision, delete the connection, or change joining | POST …/ssoConnection:promote · DELETE …/ssoConnection · PUT …/ssoPolicy |
No other action asks you to confirm. That includes revoking a token and cancelling a scheduled workspace deletion. If you call one of these routes with a console session that's too old, you get 403 with "error": "recent_sign_in_required" and "maxAgeSeconds": 900. The request has no effect, so sign in again and send it again. API tokens are never asked to confirm, because they have no sign-in to check.
Sign out everywhere
POST /v1/users/me:revokeSessions ends every console session you've started, on every device, including the one you call it from. After that, the API refuses those sessions with 401 and "error": "session_revoked", and they can't be refreshed. A session you start afterwards isn't affected.
- It takes effect at once on the server that answers, and everywhere within a minute.
- It isn't tied to one workspace. It ends your sessions in all your workspaces.
- Personal access tokens and CLI keys keep working. Revoke those separately, for example under Settings → Personal tokens.
- You must call it from a console session. An API token gets
403, because a token can't sign its owner out.
The console has no button for this yet. You can only do it through the API.
Error codes
| Code | Status | When | What to do |
|---|---|---|---|
sign_in_method_not_allowed | 403 | Any workspace request | Sign in again with a method the body lists in allowedMethods. |
recent_sign_in_required | 403 | An action that asks you to confirm | Confirm it's you, or sign in again, then send the request again. |
session_revoked | 401 | Any request | Sign in again. |
EMAIL_NOT_ALLOWED | 401 | SSO sign-in | The identity provider sent no email attribute, or sent an address on a domain that isn't attached. |
STALE_SIGN_IN | 401 | SSO sign-in | The identity provider sign-in is more than 5 minutes old. Sign in again. |
CONNECTION_UNAVAILABLE | 401 | SSO sign-in | The connection was deleted, or it's off. |
SSO_AUTO_JOIN_OFF · SSO_JOIN_DOMAIN_NOT_ELIGIBLE | 409 | Joining after SSO | Ask an admin for an invitation. Auto-join needs an address on a Verified attached domain. |
SSO_DOMAIN_NOT_VERIFIED · SSO_DOMAIN_ATTACHED_ELSEWHERE | 409 | Attach domain | Verify the domain under Domains first. If another workspace has attached it, contact support. |
SSO_CANDIDATE_NOT_APPLIED · SSO_REVISION_NOT_TESTED | 409 | Test sign-in, Turn on single sign-on | Wait for Applied, then pass a test before turning it on. |
SSO_TEST_EMAIL_NOT_ATTACHED | 409 | Test sign-in | Sign in with an address on an attached domain, and check the email attribute. Any other SSO_TEST_* code means you need to start the test again. |
DOMAIN_RECORD_NOT_FOUND · DOMAIN_RECORD_MISMATCH | 409 | Verify | Publish the TXT record at the domain itself, with this claim's exact value. |
DOMAIN_CLAIM_RELEASED | 409 | Verify | Use Claim again to get a new record. |
Next steps
- Team & Roles: invite members and manage roles
- Tokens and Service Accounts: programmatic access, which sign-in rules don't affect
- Settings: the rest of the workspace's configuration
- Security: build agents you can put in front of customers