> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Okta SSO

> Set up SAML Single Sign-On between Okta and StackOne.

Connect Okta as your organization's SAML 2.0 identity provider so members sign in to StackOne with their Okta credentials. Once the connection is verified, anyone with an `@acme.com` address is redirected to Okta to authenticate.

Setup has four stages:

1. [Start the connection in StackOne](#start-the-connection-in-stackone) and copy the Service Provider values.
2. [Create the SAML app in Okta](#create-the-saml-app-in-okta) and collect the identity provider values.
3. [Register the provider in StackOne](#register-the-provider-in-stackone) with those values.
4. [Verify your domain](#verify-your-domain) to activate SSO.

## Before you begin

* The **Org Admin** role in your StackOne organization, since only Org Admins manage SSO.
* Administrator access to your **Okta Admin Console**.
* The ability to add a DNS TXT record for `acme.com`, which proves you own the domain.

<Note>
  SSO is enabled per organization. If you don't see **Organization > Security > SSO**, even as an Org Admin, contact StackOne support to turn it on.
</Note>

## Start the connection in StackOne

<Steps>
  <Step title="Choose Okta as your provider">
    Go to **Organization > Security > SSO** in the StackOne dashboard (app.stackone.com) and click **Get started** to open the **Set up SSO** wizard. On the first step, select **Okta** as your provider.
  </Step>

  <Step title="Name the connection and set the domain">
    On the **Connection details** step, fill in both fields:

    * **Connection name**: `Acme Okta`. StackOne generates the connection's unique ID from this name, for example `acme-okta`.
    * **Domain**: `acme.com`. Members whose email is on this domain sign in through Okta.
  </Step>

  <Step title="Copy the Service Provider values">
    On the **Configure your identity provider** step, StackOne shows three values that tell Okta where to send the assertion and how to identify StackOne. Copy each one exactly as shown, since the connection ID inside them can pick up a random suffix (for example `acme-okta-x8k2p`) when the plain name is already taken:

    * **ACS URL (Single sign-on URL)**: where Okta posts the SAML assertion.
    * **Audience URI (SP Entity ID)**: identifies StackOne to Okta.
    * **Default RelayState**: your dashboard URL, where an IdP-initiated sign-in lands.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-configure.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=ce53c700fe567284db0eb0ecc105c9bc" alt="StackOne Configure step showing the ACS URL and SP Entity ID to copy into Okta" style={{ maxWidth: "360px" }} width="862" height="1400" data-path="images/identity/sso/sso-configure.png" />
    </Frame>

    <Note>
      Keep this StackOne tab open. You return to the wizard to register the provider after you build the Okta app.
    </Note>
  </Step>
</Steps>

## Create the SAML app in Okta

<Steps>
  <Step title="Create a SAML app integration">
    In the **Okta Admin Console**, go to **Applications > Applications** and click **Create App Integration**. Choose **SAML 2.0**, then click **Next**.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/ZC4YWqkzLcgSAzHk/images/guides/sso-okta-create-app.png?fit=max&auto=format&n=ZC4YWqkzLcgSAzHk&q=85&s=86bf9313103131062980572136ed3167" alt="Okta Create App Integration dialog with SAML 2.0 selected" width="977" height="580" data-path="images/guides/sso-okta-create-app.png" />
    </Frame>
  </Step>

  <Step title="Name the app">
    On **General Settings**, set the **App name** to `StackOne SSO` so it's recognizable in Okta, then click **Next**.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/ZC4YWqkzLcgSAzHk/images/guides/sso-okta-general-settings.png?fit=max&auto=format&n=ZC4YWqkzLcgSAzHk&q=85&s=f774d9b9fedebf6519861a8a5da1d66e" alt="Okta general settings page with the app named StackOne SSO" width="1083" height="620" data-path="images/guides/sso-okta-general-settings.png" />
    </Frame>
  </Step>

  <Step title="Enter the SAML settings">
    In **Configure SAML**, paste the values you copied from StackOne:

    | Okta field                      | Value from StackOne                                    |
    | ------------------------------- | ------------------------------------------------------ |
    | **Single sign-on URL**          | the ACS URL                                            |
    | **Audience URI (SP Entity ID)** | the SP Entity ID                                       |
    | **Default RelayState**          | the Default RelayState you copied (your dashboard URL) |
    | **Name ID format**              | `EmailAddress`                                         |
    | **Application username**        | `Email`                                                |

    Setting **Name ID format** to `EmailAddress` and **Application username** to `Email` makes Okta send the user's email as the SAML subject, which is how StackOne matches the user.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/kTFEJ4y8SKJHArug/images/guides/sso-okta-saml-settings.png?fit=max&auto=format&n=kTFEJ4y8SKJHArug&q=85&s=eedd7c9f495054e1da89488683bfaaba" alt="Okta SAML settings filled with the StackOne ACS URL, Audience URI, EmailAddress Name ID, and Email username" width="747" height="632" data-path="images/guides/sso-okta-saml-settings.png" />
    </Frame>
  </Step>

  <Step title="Add name attribute statements">
    Further down the same **Configure SAML** screen, under **Attribute Statements (optional)**, add two attributes:

    | Name        | Name format | Value            |
    | ----------- | ----------- | ---------------- |
    | `givenName` | Unspecified | `user.firstName` |
    | `surname`   | Unspecified | `user.lastName`  |

    StackOne reads these to set a member's display name when it creates their account on first sign-in. Without them, the assertion carries only the email subject, so new members show their email address as their name. Enter the attribute names exactly as shown.

    Click **Next**, then **Finish**.

    <Note>
      Already connected? Add the same two attribute statements to your existing StackOne SSO app in Okta — they apply to members created after the change. If the connection also uses [Directory Sync](/identity/scim/overview), display names sync from Okta profiles as well.
    </Note>
  </Step>

  <Step title="Copy the identity provider metadata">
    Open the app's **Sign On** tab. In the **SAML Setup** panel, click **View SAML setup instructions**, then copy:

    * **Identity Provider Issuer**: the Entity ID, for example `http://www.okta.com/exk...`.
    * **Identity Provider Single Sign-On URL**: Okta's login endpoint.
    * **X.509 Certificate**: the signing certificate in PEM format.

    To register all three at once instead, download the **Identity Provider metadata** XML from the same tab. StackOne reads the issuer, SSO URL, and certificate from it.

    <Note>
      Okta generates a separate signing certificate for each app. If you've set up StackOne SSO before, copy the certificate from this app's setup instructions rather than reusing an earlier download.
    </Note>

    <Frame>
      <img src="https://mintcdn.com/stackone-60/ZC4YWqkzLcgSAzHk/images/guides/sso-okta-idp-metadata.png?fit=max&auto=format&n=ZC4YWqkzLcgSAzHk&q=85&s=cddc946ef7306aaf10aa8492c5121920" alt="Okta Sign On tab showing the Identity Provider Issuer, SSO URL, and X.509 certificate" width="1033" height="827" data-path="images/guides/sso-okta-idp-metadata.png" />
    </Frame>
  </Step>

  <Step title="Assign users">
    Open the **Assignments** tab and assign the people or groups who should sign in to StackOne through Okta. Only assigned users can complete SSO.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/ZC4YWqkzLcgSAzHk/images/guides/sso-okta-assign-users.png?fit=max&auto=format&n=ZC4YWqkzLcgSAzHk&q=85&s=ad0d8598d3b0282569f44e1030f6f3de" alt="Okta Assignments tab for adding users to the StackOne SSO application" width="760" height="702" data-path="images/guides/sso-okta-assign-users.png" />
    </Frame>
  </Step>
</Steps>

## Register the provider in StackOne

<Steps>
  <Step title="Return to the wizard">
    Switch back to the StackOne tab and continue to the **Register your SSO provider** step.
  </Step>

  <Step title="Provide the Okta values">
    Supply the three values from Okta one of two ways.

    <Tabs>
      <Tab title="Upload metadata XML">
        Click **Upload SAML metadata file** and select the **Identity Provider metadata** XML you downloaded from Okta. StackOne fills in **Entity ID (Issuer)**, **SSO URL (Entry Point)**, and **X.509 Certificate**. Review the imported values before continuing.

        <Frame>
          <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-register.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=2f1d515933effeba3147b792681f03b3" alt="StackOne Register step with the metadata upload option above the manual entry fields" style={{ maxWidth: "360px" }} width="952" height="1278" data-path="images/identity/sso/sso-register.png" />
        </Frame>
      </Tab>

      <Tab title="Enter values manually">
        Paste each value from Okta into the matching StackOne field:

        | StackOne field            | Okta value                           |
        | ------------------------- | ------------------------------------ |
        | **Entity ID (Issuer)**    | Identity Provider Issuer             |
        | **SSO URL (Entry Point)** | Identity Provider Single Sign-On URL |
        | **X.509 Certificate**     | X.509 Certificate                    |

        <Frame>
          <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-register-filled.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=7eee05d311740568e5cece500296b584" alt="StackOne Register form completed with the Okta issuer, SSO URL, and certificate" style={{ maxWidth: "360px" }} width="952" height="1250" data-path="images/identity/sso/sso-register-filled.png" />
        </Frame>
      </Tab>
    </Tabs>
  </Step>

  <Step title="Register the connection">
    Continue to save the connection. StackOne registers it and lists it on the **SSO** tab under **Organization > Security > SSO**. Open the connection to see its overview, where the **Trusted Domain** card tracks domain verification.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-connection-pending.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=bd4b75efdd5b9592b39473e117afcc07" alt="StackOne SSO connection card showing configuration details and pending domain verification" width="1568" height="716" data-path="images/identity/sso/sso-connection-pending.png" />
    </Frame>
  </Step>
</Steps>

## Verify your domain

Verification proves you own `acme.com` and activates SSO. Until it passes, members on the domain aren't redirected to Okta.

<Steps>
  <Step title="Copy the DNS TXT record">
    On the wizard's **Verify your domain** step, or later from the connection's **Trusted Domain** card by clicking **Verify** to open the **Verify Domain** panel, copy the TXT record. It has this shape:

    ```
    _stackone-sso-verification-token-acme-okta=<verification-token>
    ```

    The record **Name** is your domain, `acme.com`.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-verify-domain.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=391e22c65537eccff5d8c12b1099994e" alt="StackOne domain verification section showing the DNS TXT record name and value" width="1028" height="822" data-path="images/identity/sso/sso-verify-domain.png" />
    </Frame>
  </Step>

  <Step title="Add the record to your DNS">
    In your DNS provider's management panel, add a TXT record:

    * **Name/Host**: `acme.com`. Use `@` if that's the root of your DNS zone, or the subdomain label if your email domain is a subdomain.
    * **Value**: the full `_stackone-sso-verification-token-acme-okta=...` string, as its own value.

    <Warning>
      Add the `_stackone-sso-verification-token-...` string as the record's **Value**, not its Name. That leading-underscore string looks like a DNS host label (as `_dmarc` and `_domainkey` do), so it's easy to paste into the **Name/Host** field by mistake, but the Name is your domain itself (`acme.com`, or `@` at the zone root). A record on the wrong name silently fails verification, the most common cause of the failures below.
    </Warning>

    How you add the value depends on the provider. Cloudflare lets you add a separate TXT record at the same name. AWS Route 53 and Google Cloud DNS keep one TXT record set per name, so add the token as a new value on its own line rather than appending it to an existing string such as your SPF record.

    <Note>
      DNS changes can take up to 48 hours to propagate, though they often complete within minutes. Check what's publicly visible with [Google Admin Toolbox Dig](https://toolbox.googleapps.com/apps/dig/#TXT/).
    </Note>
  </Step>

  <Step title="Verify in StackOne">
    Back in StackOne, click **Verify**. Once the record is visible, the connection shows as verified and SSO is active for `acme.com`. If the check fails, wait for propagation and try again. You can also verify later from the connection's **Trusted Domain** card.

    <Frame>
      <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-connection-verified.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=d141a7432888b89b17af53d9eb2da5d8" alt="StackOne SSO connection card showing the domain as verified and SSO active" width="1568" height="716" data-path="images/identity/sso/sso-connection-verified.png" />
    </Frame>
  </Step>
</Steps>

## Manage the connection

The connection is listed on the **SSO** tab under **Organization > Security > SSO**. Open it to see the connection overview.

<Frame>
  <img src="https://mintcdn.com/stackone-60/y1H5HYQCzx5b5iEx/images/identity/sso/sso-connection-general.png?fit=max&auto=format&n=y1H5HYQCzx5b5iEx&q=85&s=8d64fd3713341e5f2d1836d61ac24b51" alt="The connection's General tab, showing the SAML 2.0 Configuration values (Single sign-on URL, Audience URI, Default Relay State) and the Trusted Domain verification status." width="1568" height="716" data-path="images/identity/sso/sso-connection-general.png" />
</Frame>

The **General** tab is where you maintain the connection after setup:

* Click **Edit SAML** to update the identity provider values, either by re-uploading the metadata XML or by editing the **Entity ID (Issuer)**, **SSO URL (Entry Point)**, and **X.509 Certificate** directly.
* Click **Edit Domain** to change the trusted domain. Changing it resets verification, so re-verify afterward.

From the connection's page header:

* **Settings** edits the **Connection name**. The **Provider ID** is generated at setup and can't be changed.
* **Delete** removes the SSO connection. It's disabled while SSO is enforced, so turn off enforcement on the **Authentication** tab first.

To require SSO, open the **Authentication** tab, and in the **Enforcement Policy** card click **Edit policy**. Add this connection's method under **Enforced methods** and save. Members can then only sign in with the selected methods, which disables email and password sign-in.

<Warning>
  Deleting the connection sends members on `acme.com` back to email and password sign-in, so make sure they have another way in first. It also tears down **Directory Sync** if one is linked: deleting the SSO connection cascades away its Directory Sync, revoking the SCIM token so Okta's provisioning starts failing with `401` on its next cycle. Members already provisioned keep their access, but you must re-link Directory Sync and update Okta with the new token afterward. To change SAML values, use **Edit SAML** instead of deleting.
</Warning>

<Tip>
  After the domain is verified, you can add **Directory Sync (SCIM)** to this connection from the **Provisioning** tab to automatically create, update, and deactivate members from Okta. It syncs members (users) only. Group sync isn't available yet. See [Directory Sync](/identity/scim/overview).
</Tip>

## Troubleshooting

| Symptom                                                                | Likely cause                                                                                                                               | Fix                                                                                                                                                                              |
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SSO option not visible                                                 | SSO is enabled per organization and isn't on for yours yet.                                                                                | Contact StackOne support to enable it.                                                                                                                                           |
| `ERROR_UNMATCH_CERTIFICATE_DECLARATION_IN_METADATA`                    | The registered certificate doesn't match the one Okta signs with. Okta issues a new certificate per app.                                   | Re-copy the **X.509 Certificate** from this app's **View SAML setup instructions** and update it via **Edit SAML**.                                                              |
| `ERR_UNMATCH_ISSUER`                                                   | The **Entity ID (Issuer)** doesn't match the issuer Okta sends.                                                                            | Copy the **Identity Provider Issuer** (`http://www.okta.com/exk...`) and update it via **Edit SAML**.                                                                            |
| "Provider domain has not been verified"                                | Domain verification hasn't completed.                                                                                                      | Finish [Verify your domain](#verify-your-domain).                                                                                                                                |
| Sign-in redirects to the wrong Okta, or a domain appears already taken | StackOne doesn't automatically reserve a domain to one organization, so another StackOne organization may have registered the same domain. | Contact StackOne support to resolve which organization should own SSO for the domain before you enforce it.                                                                      |
| Verification keeps failing                                             | The TXT record is on the wrong name, not its own value, or DNS hasn't propagated.                                                          | Use `@` for a root domain or the subdomain label otherwise, add the token as its own TXT value, and check propagation with [Dig](https://toolbox.googleapps.com/apps/dig/#TXT/). |
| Members not redirected to Okta                                         | The domain isn't verified, or the user isn't assigned in Okta.                                                                             | Verify the domain, and confirm the user is on the app's **Assignments** tab.                                                                                                     |
| New members show their email address as their name                     | The app sends no name attribute statements, so the assertion carries only the email subject.                                               | Add the `givenName` / `surname` attribute statements to the Okta app (see the setup steps above).                                                                                |
| `403 Forbidden` when opening SSO                                       | You lack the **Org Admin** role.                                                                                                           | Ask an Org Admin to make the change or to grant you the role.                                                                                                                    |

<Note>
  IdP-initiated sign-in is supported. A user who clicks the StackOne tile in their Okta dashboard is signed in and lands on the StackOne dashboard.
</Note>

## Next steps

<CardGroup cols={2}>
  <Card title="SSO overview" icon="book-open" href="/identity/sso/overview">
    How SSO, domain verification, and Directory Sync fit together.
  </Card>

  <Card title="Microsoft Entra SSO" icon="microsoft" href="/identity/sso/microsoft-entra">
    Set up SAML SSO with Entra ID instead of Okta.
  </Card>

  <Card title="Generic SAML SSO" icon="shield-halved" href="/identity/sso/saml-generic">
    Connect any SAML 2.0 identity provider.
  </Card>
</CardGroup>
