What QX offers
- A person signs in to QX with the SSO login in Okta, through the OIDC protocol. QX never sees the password.
- Okta creates, updates and deactivates the users of QX through user provisioning, with the SCIM 2.0 protocol. QX receives users only. The groups stay in Okta.
- By default, the role comes from QX: a new person signs in as an operator, and the owner changes the role in Users. If the company prefers, the owner group in Okta sets the role at each login.
- The owner can turn on the e-mail binding. With it, the first SSO login links the person to the QX user with the same e-mail.
- The owner turns on required SSO for the whole organization. With the rule on, nobody in the organization signs in with a password, including the owner.
- When the organization requires two-step verification, the SSO connection chooses where the person proves the second factor: in Okta or in the QX authenticator app.
- A session that starts with the SSO login expires at the time that the owner chooses, from 1 to 8 hours after the login. It does not extend.
- The owner removes the SSO connection to change the authorization server or the Okta app, and then configures a new one.
prompt=login and max_age=0. On Identity Engine, max_age=0 forces a new login. Okta Classic uses max_age=1, and QX does not test Classic.
The order of the work
Do the steps in this order:- The IT team creates the OIDC app in Okta.
- The IT team assigns the app to the people and configures the groups.
- The owner configures the SSO connection in QX.
- The IT team pastes the QX login URL into the app.
- The owner issues the provisioning key.
- The IT team activates user provisioning in Okta.
- The owner does the login test.
- The owner enables SSO login.
- The owner turns on required SSO.
- The Okta user of the owner has the same e-mail as the QX user of the owner.
- When the owner group sets the role, the owner is in that group.
The QX addresses
The owner sees the addresses in Settings › SSO, in the box Addresses for the identity provider. Each address has a Copy button.
The name Initiate login URI comes from the Okta help. The names of the other two fields follow the Okta Admin Console (not checked against an official source).
The login URL shows only after the owner saves the SSO connection. The other two addresses are these:
1. Create the OIDC app in Okta
The names of the menus and the fields in this list follow the Okta Admin Console (not checked against an official source).- In the Admin Console, open Applications › Applications and click Create App Integration.
- Select OIDC - OpenID Connect and Web Application, and click Next.
- In App integration name, type
QX. - In Grant type, keep Authorization Code.
- In Sign-in redirect URIs, paste the QX redirect URI.
- Click Save. The General tab shows the client ID and the client secret.
- In Client authentication, keep Client secret.
- QX always sends PKCE with
S256. The option Require PKCE as additional verification can stay on. - Copy the client ID and the client secret.
client_secret_basic and client_secret_post at the token endpoint. Which method a new app uses by default: not checked against an official source. In QX, start with Basic (client_secret_basic). If the login test fails with “The login test failed.”, switch to Post (client_secret_post) and test again.
Give the client ID and the client secret to the owner through a safe channel, such as a password manager.
2. Assign the app and configure the groups
- Assign the app to the people or the groups that use QX. When the owner group sets the role, assign that group too.
- Only when the owner group sets the role: make Okta send the
groupsclaim in the ID token, as the list below explains.
groups scope at each login and reads the groups claim. When QX sets the role, QX does not ask for this scope. The values of the claim are the group names. Okta sends up to 100 groups.
- On the org authorization server (
https://<Okta domain>), use the Groups claim filter of the app. Name the claimgroupsand choose a filter that includes the owner group, such as Equals with the group name. This filter puts the groups in the ID token only, which is the token that QX reads. - On a custom authorization server (
https://<Okta domain>/oauth2/<server id>), create on the server a claimgroupswith the value type Groups, in the ID token, with a filter that includes the owner group.
groups to accept the QX request with the owner group: not checked against an official source. If Okta refuses the request because of the groups scope, create that scope on the server.
3. Configure the SSO connection in QX
The owner does these steps in QX:- Open Settings › SSO and click Configure SSO connection.
- Select Okta and click Continue.
- In Identity provider address, paste the issuer of the authorization server:
https://<Okta domain>for the org server, orhttps://<Okta domain>/oauth2/<server id>for a custom server. Each Okta org has the custom serverdefault. QX removes the slash at the end of the address. The address stays fixed after the owner saves the connection. - In Client ID and Client secret, paste the values of step 1.
- In Client authentication, select the same method as the app: Basic (client_secret_basic) or Post (client_secret_post).
- In Role of the people, select Set in QX or Set by the owner group. With the second option, type in Owner group the name of the group exactly as Okta sends it at the login.
- Only with the owner group: check the line “With the owner group, QX also asks for the groups scope.”
- If QX users will sign in before user provisioning links each one, select Link QX users by e-mail. The option works only when QX sets the role. Okta sends
email_verified, which the binding needs. - In Two-step verification, select Through Okta or Through the QX authenticator app. The section Two-step verification of this guide explains the options.
- In SSO session duration, select from 1 to 8 hours. The default is 8 hours.
- Click Save SSO connection. If the login of the owner is older than 15 minutes, QX asks for the password.
iss of each token, character by character. With a custom domain, the issuer mode of the server (ORG_URL, CUSTOM_URL or DYNAMIC) decides the iss. In the DYNAMIC mode, the iss changes with the domain of the request. In QX, use the address that the iss of the tokens shows.
A change to the role of the people, the owner group, the e-mail binding or the two-step verification ends the sessions that started with SSO. Make the change outside working hours.
A new client ID or a new Client authentication needs the SSO login disabled and asks for a new login test. The owner makes the change in this order:
- If required SSO is on, click Turn off required SSO.
- Click Disable SSO login. All sessions that started with SSO end, including the session of the owner. The owner signs in again with the password, or creates a password with Forgot your password?.
- Click Edit SSO connection, change the value and click Save SSO connection.
- Click Test login.
- Click Enable SSO login.
- If required SSO was on, click Turn on required SSO.
4. Paste the login URL into Okta
- Open the OIDC app in Okta.
- In Initiate login URI, paste the QX login URL.
- Select Redirect to app to initiate login (OIDC Compliant).
- Save the app.
iss parameter with the org address, also when QX uses a custom server. QX ignores this parameter and always starts a new login.
5. Issue the provisioning key
The owner does these steps in QX:- In Settings › SSO, click Manage provisioning keys.
- Click Issue provisioning key, then Issue key. If the login of the owner is older than 15 minutes, QX asks for the password.
- Copy the key. QX shows the key only once. The key starts with
qxp_. - Give the key to the IT team through a safe channel. Do not send the key by e-mail or by message.
- After the IT team pastes the key, check I pasted the key into the identity provider and click Back to the keys.
6. Activate user provisioning in Okta
Okta configures SCIM 2.0 in an App Integration Wizard app. Whether the OIDC app of step 1 offers SCIM provisioning: not checked against an official source. When the OIDC app does not offer it, use an Okta app with SCIM and assign the same people to it.- In the SCIM settings of the app, in SCIM connector base URL, paste the user provisioning base URL, with no slash at the end.
- In Unique identifier field for users, select the e-mail. Okta looks for the person in QX by
userNamewith this value. - In the authentication, select HTTP Header and paste the provisioning key as the bearer token.
- Leave Import Groups and Push Groups off. QX does not receive groups.
- Save. Okta calls
GET /Users?startIndex=1&count=2, and QX answers with the list of users. - In the Provisioning tab, under To App, click Edit. Turn on Create User, Update User Attributes and Deactivate Users, and click Save.
sub of the login, which is the Okta user ID. User provisioning must send the same value in externalId. The create example of the Okta documentation sends the Okta user ID in externalId. Whether every App Integration Wizard app sends externalId: not checked against an official source.
Without externalId, QX refuses the create with the message “QX needs externalId to create or link a user when the SSO connection does not link users by e-mail”. Then the owner selects Link QX users by e-mail. User provisioning then accepts a user with no externalId, and the first SSO login completes the binding.
What QX does with the calls of Okta:
- Okta updates the user with a
PUTof the whole user. APUTwith noexternalIdkeeps the value that QX stored. - Okta sends a placeholder password in the create. QX ignores the password.
- To deactivate the person, Okta sends
active=falsein aPUT. Okta never sendsDELETE.
7. Do the login test
- In Settings › SSO, the owner clicks Test login.
- QX opens Okta and asks for a new login. The owner signs in with their own user.
- QX shows “The login test passed. The SSO connection is verified.”
auth_time in the token, and Okta sends this claim at each login.
The test needs two things:
- When the owner group sets the role, the owner is in the owner group.
- When the organization requires two-step verification through Okta, the owner signs in to Okta with the second factor.
8. Enable SSO login
- In Settings › SSO, the owner clicks Enable SSO login. If the login of the owner is older than 15 minutes, QX asks for the password.
- A person who is not an owner opens QX from the Okta dashboard and checks the login.
9. Turn on required SSO
- In Settings › SSO, the owner clicks Turn on required SSO.
- The owner reads the warning and clicks Turn on required SSO again. If the login of the owner is older than 15 minutes, the warning asks for the password.
Two-step verification
The option of the SSO connection applies when the organization requires two-step verification. A change of the option ends the sessions that started with SSO.- Through Okta: QX sends
acr_values=urn:okta:loa:2fa:anyin each request to Okta. QX accepts the SSO login only when theacrof the token isurn:okta:loa:2fa:any. With this option, QX does not read theamr. A token with noacr, or with a single factor value such asurn:okta:loa:1fa:any, does not pass. - Through the QX authenticator app: after the login in Okta, the person types the code of the QX authenticator app. At the first login, the person sets up the app. The person has 15 minutes to finish. After that time, the person signs in again through Okta.
Session duration
The owner chooses the SSO session duration in Edit SSO connection, from 1 to 8 hours. After that time, the person signs in again through Okta. A shorter time also shortens the open sessions, counted from the login. A longer time applies to the next logins only. The identity confirmation does not change the time.How QX treats each person
- User provisioning creates the user of a new person. The Users screen shows “Waiting for SSO login”. The first SSO login activates the user. A new user is an operator.
- When the person already has a QX user, user provisioning links that user by the e-mail, in the same organization. The user keeps the history.
- When QX sets the role, the owner changes the role in Users, and the SSO login does not change the role.
- When the owner group sets the role, the role changes at the next SSO login after a group change. A person in the group signs in as an owner, and the other people sign in as operators. The role is read-only in Users.
- QX does not create a user at the first login through Okta. A person with no QX user signs in after user provisioning creates the user.
- To deactivate a person, remove the app assignment or deactivate the person in Okta. Okta sends
active=false, and QX deactivates the user. All sessions of the user end at the same moment. - Okta sends nothing to QX when it suspends a person. The sessions of that person in QX continue until they expire. To end the access at once, deactivate the person. A short duration limits the time of the open sessions.
- When Okta sends
active=truefor a deactivated user, the user goes back to “Waiting for SSO login” and signs in again at the next SSO login. - Okta never deletes a QX user. The deactivated user and its history stay in QX.
- The name and the e-mail of the person change only in Okta. The owner sees the user in QX, but does not change them.
- A new e-mail in Okta does not block the SSO login. The user page shows the Okta e-mail when it differs from the e-mail in QX.
Replace the provisioning key
The SSO connection keeps up to 2 active keys. With two keys, Okta switches to the new key with no gap in user provisioning.- The owner issues a new key, as in step 5. In a session that started with SSO, when the login is older than 15 minutes, QX asks for the identity confirmation in Okta.
- The IT team pastes the new key into the HTTP Header authentication of the SCIM settings of the app and saves.
- The owner checks the Last use column of the new key.
- The owner clicks Revoke on the old key, then Revoke key.
Replace the client secret
- In Okta, the IT team generates a new client secret in the General tab of the app (not checked against an official source).
- The owner opens Edit SSO connection, pastes the new secret into Client secret and clicks Save SSO connection.
When Okta is down
With required SSO on, nobody signs in to QX while Okta is down. The open sessions continue until they expire.- If an owner still has an open session, the owner clicks Turn off required SSO in Settings › SSO. QX asks for no confirmation, so this works while Okta is down.
- If no owner has an open session, ask QX support. Support turns off required SSO and writes the reason in the audit log.
- A person with no password clicks Forgot your password? on the login page and sets a password.
- When Okta is back, the owner clicks Turn on required SSO.
Remove the SSO connection
To change the authorization server, the domain or the Okta app, the owner removes the SSO connection and configures a new one. The new connection has another login URL.- In Settings › SSO, the owner clicks Remove connection. If the login of the owner is older than 15 minutes, QX asks for the password or for the identity confirmation.
- The owner reads the warning and clicks Remove connection again.
- The sessions that started with SSO end, including the session of the owner.
- SSO login and required SSO stop. People sign in with a password.
- QX deletes the external identities and the provisioning keys. Okta stops creating and deactivating users in QX. Turn off provisioning in the old Okta app.
- The users stay in QX. A person who only signed in with SSO creates a password with Forgot your password?, on the login page.
Refusal messages
Sources
- Okta, Authorization servers.
- Okta, OpenID Connect & OAuth 2.0 API.
- Okta, Customize tokens returned from Okta with a Groups claim.
- Okta, Step-up authentication.
- Okta, Custom URL domain.
- Okta, Create OIDC app integrations.
- Okta, Develop a custom OpenID Connect application that can support SSO when launched from the Okta dashboard.
- Okta, Okta and SCIM Version 2.0.
- Okta, SCIM FAQs.
- Okta, Create SCIM app integrations.
- Okta, discovery documents of the servers of the org
okta.okta.com:https://okta.okta.com/.well-known/openid-configurationandhttps://okta.okta.com/oauth2/default/.well-known/openid-configuration.