---
title: "Okta"
description: "Optimize your Okta SSO for Cloud CMS with easy setup and detailed SAML 2.0 configuration instructions. (Gitana 4.0)"
product: "Gitana"
version: "4.0"
url: "/documentation/gitana/4.0/engine/sso/okta"
---

![okta-logo.png](/documentation/gitana/4.0/engine/sso/okta/okta-logo.png)

# Okta

This page provides information on how to configure Cloud CMS Single Sign On (SSO) for Okta and SAML 2.0.

Cloud CMS provides Single Sign On (SSO) Enterprise support for a variety of Identity Providers using SAML 2.0 and/or JWT. For more information, see [Cloud CMS Single Sign On (SSO)](/documentation/gitana/4.0/engine/sso/overview.md).

You can learn more about Okta here:

```
https://www.okta.com
```

## Set up Okta

In this section, we'll set up Single Sign On with Okta.

### Log into the Okta Administration Console

```
Login at https://{your-okta-domain}.okta.com 
```

Then, click **Admin**, and go to **Applications**

![okta1.png](/documentation/gitana/4.0/engine/sso/okta/okta1.png)

### Create an Application

Create a new Application for "Cloud CMS"

Select **Add Applications** from the "Shortcuts" menu on the right. And then the **Create New App** button.

You will see a form like this:

![okta2.png](/documentation/gitana/4.0/engine/sso/okta/okta2.png)

Select "Platform" "Web" and "Sign on Method" "SAML 2.0". Click **Create**

Enter **Cloud CMS** for "App name". This is only an example. It can be any name you like.

Click **Next**

You will see the following form:

![okta3.png](/documentation/gitana/4.0/engine/sso/okta/okta3.png)

For Single sign on URL enter the Cloud CMS Assertion Consumer Service URL: https://{your-cloudcms-domain}.cloudcms.net/saml

Enter **cloudcms** for "Audience URI". Remember this value as it is required in the Cloud CMS SSO configuration in a future step. This value is only an example. It can be any name you like.

Click **Next** and **Finish**

From the "General" settings of the new "Application", copy the URL value under **EMBED LINK**. You will need this URL in the **Set up Cloud CMS** step below.

From "SAML Signing Certificates" download a certificate. Use this for the **Certificate** in the **Set up Cloud CMS** step below.

![okta4.png](/documentation/gitana/4.0/engine/sso/okta/okta4.png)

### Mappings

To have custom user properties map to your Cloud CMS users, you'll want to configure the **User Mappings** for each property to map to a subproperty of the **user** object in the SAML response, like so:

![okta5.png](/documentation/gitana/4.0/engine/sso/okta/okta5.png)

In order for Cloud CMS to map groups from your Okta users, ensure to map all relevant group ids to the **groups** property like this:

![okta6.png](/documentation/gitana/4.0/engine/sso/okta/okta6.png)

### SAML Assertion

Once you've set up your mappings, you ought to be able to preview the SAML Assertion for your user. It should look something like this:

```
<?xml version="1.0" encoding="UTF-8"?>
<saml2:Assertion ID="id166645512997613619036728" IssueInstant="2025-02-26T15:24:51.016Z" Version="2.0"
    xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
    <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://www.okta.com/xyz123</saml2:Issuer>
    <saml2:Subject>
        <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">joesmith@company.com</saml2:NameID>
        <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml2:SubjectConfirmationData NotOnOrAfter="2025-02-26T15:29:51.016Z" Recipient="http://mycompany.cloudcms.net/saml"/>
        </saml2:SubjectConfirmation>
    </saml2:Subject>
    <saml2:Conditions NotBefore="2025-02-26T15:19:51.016Z" NotOnOrAfter="2025-02-26T15:29:51.016Z">
        <saml2:AudienceRestriction>
            <saml2:Audience>cloudcms</saml2:Audience>
        </saml2:AudienceRestriction>
    </saml2:Conditions>
    <saml2:AuthnStatement AuthnInstant="2025-02-26T15:07:19.996Z" SessionIndex="id1740583491014.143994899">
        <saml2:AuthnContext>
            <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
        </saml2:AuthnContext>
    </saml2:AuthnStatement>
    <saml2:AttributeStatement>
        <saml2:Attribute Name="firstName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Joe
            </saml2:AttributeValue>
        </saml2:Attribute>
        <saml2:Attribute Name="lastName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Smith
            </saml2:AttributeValue>
        </saml2:Attribute>
        <saml2:Attribute Name="MEMBERS" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Everyone
            </saml2:AttributeValue>
            <saml2:AttributeValue
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">cheeseheads
            </saml2:AttributeValue>
        </saml2:Attribute>
    </saml2:AttributeStatement>
</saml2:Assertion>
```

Your own assertion may vary. However, there are some important things to verify:

1.  The `<saml2:NameID/>` entry identifies the primary key for your user. In this case, it's the email address (`joesmith@company.com`) of the user. If your own Okta installation uses a different primary key (such as a GUID), you may need to change the _User Primary Identifier Field_ to an attribute value (see next steps).
2.  The `<saml2:Attribute/>` entries hold fields that are mapped from your Okta user schema to the assertion. In this case, we've mapped `firstName` and `lastName`. In Okta, we do this by setting the assertion field `firstName` to the value of `user.firstName`. Okta's expression language evaluates this and plugs in the correct value on the fly.
3.  The `MEMBERS` attribute is multi-value and provides a set of identifiers. Typically, these identifiers are used to execute user sync rules that automatically assign users to specific teams or projects.

### Add a User to the App

From the Admin console, select "Directory" and "People" from the top menu.

Select a user account and click the **Assign Applications** button.

A list of applications is displayed. It should now include "Cloud CMS".

Click the **Assign** button and then **Done**.

## Set up Cloud CMS

In a new browser window, log into the Cloud CMS user interface. Click on `Manage Platform` and then pick `SSO` on the left-hand menu.

Select `SAML 2.0` from the radio button list.

And then fill out the form.

![cloudcms1.png](/documentation/gitana/4.0/engine/sso/okta/cloudcms1.png)

The following is required:

1.  The `SAML URL` should be the **EMBED LINK** value you copied from the Okta "Application" you created above.
2.  The `SAML Issuer` should match the Okta Application's **Audience URI**
3.  Enter the PEM formatted certificate you downloaded from the Okta "Application" you created above into **Certificate**

Don't forget to save your changes!

### User Field Mappings (optional)

Under User Field Mappings, you can set up the following:

![okta7.png](/documentation/gitana/4.0/engine/sso/okta/okta7.png)

Where:

- `name` takes on the SAML Assertion value for `NameID`
- `firstName` takes on the SAML Assertion attribute value for `firstName`
- `lastName` takes on the SAML Assertion attribute value for `lastName`

Considering the SAML Assertion provided above, this would result in your synchronized user having a `name` of This will result in your synced user having a `name` of `joesmith@company.com`, a first name of `Joe` and a last name of `Smith`.

Don't forget to save your changes!

### Group Mappings (optional)

Under Group Mappings, you can drive behaviors based on what groups the user belongs to. These groups are expressed in the SAML Assertion via the `MEMBERS` attribute. They may also be expressed within the SAML Assertion via the `GROUPS` attribute.

In the SAML Assertion above, Joe Smith belongs to the `cheeseheads` group. We can set up a mapping rule so that any users who are members of the `cheeseheads` group are automatically added to a platform team.

Here is an example:

![okta8.png](/documentation/gitana/4.0/engine/sso/okta/okta8.png)

Let's see what we've done:

1.  Any users who belong to the `cheeseheads` group in the SAML Assertion will be added to the Platform Team identified by the team key `lambeau-faithful`. This is done by running the function `addToPlatformTeams(["lambeau-faithful"])`.
2.  Any users who belong to the `cheeseheads` group in the SAML Assertion will be added to the `newsletter` Project. This is done by running the function `addToProject("newsletter")`.
3.  Any users who belong to the `cheeseheads` group in the SAML Assertion will be added to the `packer-backers` Project. They will also be added to the `newusers` and `fanclub` teams for that Project. This is done by running the function `addToProject"packer-backers", ["newusers", "fanclub"])`.

You should be able to set up similar rules to automatically have your users added to specific Projects and Teams based on their IdP-managed profile.

Don't forget to save your changes!

## Verify it works

You can now verify that Cloud CMS is configured to use SAML 2.0:

- Log out of your current Cloud CMS account
- Log back in
- While Logging in again, you will be re-directed to Okta
- Log into Okta with your username and password.
- If the credentials match, you will be redirected back to Cloud CMS.
- Cloud CMS will automatically log you in and create your user if it doesn't yet exist.
