Skyline-ATS · For the customer's IT team

Connecting Okta to a training portal

Everything needed to connect one Okta org to a Skyline-hosted training portal. Work through it once and it is done — the checks at the end exist because each one has previously cost a round trip on a comparable setup.

Applies to one Okta org Console Okta Admin Typical time 15 minutes
0 of 0 done

What this achieves

Learners open a training address, sign in with the Okta credentials they already have, and go straight into their course. We never see or store a password, and we hold no client secret — the connection is a public OpenID Connect client using PKCE.

  1. You create and configure the app integration below.
  2. You send us two values: your issuer URL and the client ID.
  3. We connect it and run an automated check against your org.
01

Create the app integration

Admin → Applications → Applications → Create App Integration

Choose OIDC – OpenID Connect, then Single-Page Application. The application type matters more than it looks — see the note at the bottom.

02

Add the sign-in redirect URIs we send you

The app → General → Sign-in redirect URIs

We will send an exact list with this document — one per training address. Okta matches these character for character, so paste them rather than retyping.

Shape of the values — use the list we send, not these
  • https://<training-address>/auth/callback
03

Assign people to the application

The app → Assignments

An Okta app that nobody is assigned to is fully configured and completely unusable. Every automated check passes and every real person is refused at sign-in.

04

Confirm the scopes and the name claims

Security → API → Authorization Servers

We request openid, email and profile. The profile scope is what carries the learner's name, and the name is what a completion certificate prints — without it a certificate shows an email address.

05

Decide which authorization server you are using

Security → API → Authorization Servers

This decides the issuer URL you send us, and it is the value most often sent wrong. Okta has two kinds and they produce different issuers:

Org authorization server
  • https://<your-org>.okta.com
A custom authorization server, including the one named “default”
  • https://<your-org>.okta.com/oauth2/<server-id>
06

Sign-out URLs — usually nothing to do

The app → General → Sign-out redirect URIs

Signing out of training clears the training session only and leaves your Okta session alone, so no sign-out URL is required. Tell us if you would rather signing out of training also ended the Okta session — be aware that would sign them out of anything else using it — and we will send exact values to register.

07

Point your DNS at us

Your DNS provider · one CNAME per training address

Only needed if the training runs on your own domain. If we have given you an address ending in .learn.skyline-ats.dev, that is already live — skip this step.

One CNAME per address, all to the same target
  • academy.example.com   CNAME   connect.skyline-ats.dev

Send us these two values

That is everything we need. Neither is a secret.

ValueWhere to find itExample
Issuer URISecurity → API → Authorization Servers, the Issuer URI columnhttps://acme.okta.com/oauth2/default
Client IDThe app integration → General0oa1b2c3d4EfGhIjK5d7

Why this usually takes a second attempt

These share a shape: the configuration looks complete, every obvious check passes, and something still fails when a real person tries to sign in.

01

Nobody is assigned to the application

The commonest Okta failure by a distance. Everything validates — the issuer resolves, the redirect URI is accepted, the scopes exist — and every actual person is refused, because an Okta app grants nothing until people or groups are assigned to it.

02

Created as a Web Application instead of a SPA

A Web app is issued a client secret and treated as confidential. We are a public client using PKCE and hold no secret, so sign-in fails at the token exchange — after the person has already typed their password, which makes it look like our fault.

Recreate it as a Single-Page Application. The secret cannot be removed from a Web app.

03

The wrong issuer, or an app outside the authorization server's policy

https://acme.okta.com and https://acme.okta.com/oauth2/default are different issuers with different signing keys. Send the one the console shows.

And if you use a custom authorization server, its access policy has to include this application — otherwise every sign-in is refused with a message that reads like a scope problem.

04

Sign-in and sign-out redirect URIs are different fields

They sit next to each other and accept identical-looking values. Filling only the sign-out field leaves sign-in failing with a redirect mismatch while the console looks correctly completed.