JumpCloud Integration
JumpCloud is a standard OIDC identity provider and SCIM 2.0 directory. AxonFlow uses it for per-user fleet identity: each developer authenticates with a JumpCloud-issued OIDC token, and their role is resolved from the SCIM-synced directory rather than from any claim inside the token.
This gives a fleet two things a single shared credential cannot:
- Attribution — every governed action is tied to the individual developer's validated identity.
- Authorization — the developer's role comes from the directory AxonFlow audits, so an IdP misconfiguration cannot mint an administrator.
JumpCloud is first-classed as an OIDC provider (provider: "jumpcloud"). It uses
the same verifier inputs — issuer, audience, JWKS URI — as the generic oidc
provider; selecting JumpCloud simply pre-fills its well-known endpoints.
How the Two Halves Fit Together
| Concern | Source | Mechanism |
|---|---|---|
| Who the user is (identity) | The JumpCloud OIDC token | Validated against JumpCloud's JWKS (issuer, audience, expiry, RS256 signature) |
| What the user can do (role) | The SCIM-synced directory | Group-to-role mapping, never a token claim |
Configure SCIM first so the directory is populated before any token resolves to more than least privilege.
Before You Configure JumpCloud
Have these ready:
- JumpCloud admin access
- an AxonFlow SCIM token created from the customer portal
- the real enterprise portal hostname for the tenant you are provisioning into
- an operator with the
sso:configurepermission for the OIDC and role-mapping steps
Part 1 — SCIM Provisioning
Step 1: Create the AxonFlow SCIM token
In the customer portal, go to Settings → SCIM → Create Token and copy the token once. It is not shown again. Your SCIM base URL looks like this:
https://YOUR_PORTAL_OR_ENTERPRISE_DOMAIN/scim/v2
Step 2: Add JumpCloud SCIM/directory sync
-
In the JumpCloud Admin Console, open the application you use for AxonFlow (or create one) and enable Identity Management.
-
Point the SCIM connector at
https://YOUR_PORTAL_OR_ENTERPRISE_DOMAIN/scim/v2. -
For authentication, use a header with the full bearer-token format:
Bearer scim_your_token_hereThat matches the SCIM middleware, which expects an
Authorizationheader with theBearerscheme.
Step 3: Assign a pilot group
Do not begin with a company-wide assignment. Assign one pilot developer group so users and groups sync, then verify:
- the users appear in the right tenant
- the identity shape is correct
- update and deactivation flows behave correctly
Step 4: Map JumpCloud groups to roles
Roles come from the directory, never from the token. Map each synced JumpCloud
group to an AxonFlow role using the group-to-role mapping endpoints (portal
session, gated by sso:configure):
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/v1/scim/roles | List assignable role IDs |
| GET | /api/v1/scim/groups/role-mappings | List current group-to-role mappings |
| PUT | /api/v1/scim/groups/{id}/role-mapping | Set or clear a mapping for one synced group |
The fleet resolver keys on the role name, so map groups to the seeded system
roles (admin, owner, policy_admin, developer, member, viewer).
Mapping a group to a differently-named custom role resolves to least privilege.
See Group to Role Mapping for rollout order and naming guidance.
Part 2 — OIDC SSO (Per-User Fleet Identity)
Step 5: Create the OIDC application in JumpCloud
- JumpCloud Admin Console → SSO Applications → Add New Application → Custom OIDC App.
- Grant type: Authorization Code (add Refresh Token as desired). Set the redirect URI to your token-delivery tooling (a device-flow or CLI helper).
- Note the values you will need in AxonFlow:
- Issuer:
https://oauth.id.jumpcloud.com/ - JWKS URI:
https://oauth.id.jumpcloud.com/.well-known/jwks.json - Audience: your app's client ID (or a custom audience you configure)
- Issuer:
- Ensure the
emailclaim is included by requesting the standardopenid emailscopes. - Assign the app to the same developer group(s) you synced via SCIM.
Confirm the issuer, JWKS URI, and scopes against your tenant's discovery
document at https://oauth.id.jumpcloud.com/.well-known/openid-configuration
rather than copying them. A mismatched iss or aud is rejected, which looks
identical to "tokens don't work".
Step 6: Configure the OIDC provider in AxonFlow
Create the SSO configuration (portal session, gated by sso:configure):
curl -X POST "$PORTAL_URL/api/v1/sso/config" \
-H "Cookie: <portal session>" \
-H "Content-Type: application/json" \
-d '{
"provider": "jumpcloud",
"enabled": true,
"oidc_issuer": "https://oauth.id.jumpcloud.com/",
"oidc_audience": "<your client id>",
"oidc_jwks_uri": "https://oauth.id.jumpcloud.com/.well-known/jwks.json",
"oidc_claim_mapping": {"email": "email"}
}'
POSTcreates and returns409if a config already exists. To change an existing config, usePUT /api/v1/sso/configwith the same body.- Issuer and JWKS URI must use HTTPS. URLs that resolve to private or
cloud-metadata endpoints (
169.254.169.254, RFC-1918 hosts,*.internal) are rejected, because AxonFlow fetches these server-side. - Use a per-tenant issuer or audience. The verifier trusts the identity in a token signed by the configured issuer and audience. If two tenants configure the same issuer and audience, a token minted for one is structurally valid for the other. Give each tenant a distinct OIDC app so a token cannot cross a tenant boundary.
oidc_claim_mapping.emailnames the claim carrying the developer identity (defaultemail; some IdPs usepreferred_username).
You can retrieve JumpCloud's pre-filled defaults from
GET /api/v1/sso/providers/defaults?provider=jumpcloud.
Recommended Rollout Pattern
- Configure SCIM and validate provisioning with a pilot group.
- Map the pilot group to a non-privileged role (for example
developer). - Create the JumpCloud OIDC app and configure the provider in AxonFlow.
- Validate one developer's end-to-end login: token validates, role resolves.
- Expand group assignment and role mapping gradually.
Common Issues
Every token is rejected
Check that the configured oidc_issuer and oidc_audience exactly match what
JumpCloud emits (including any trailing slash on the issuer). Confirm the JWKS
URI is reachable over HTTPS and the token is RS256-signed.
Login succeeds but the developer can read nothing
The SCIM directory is not populated, or the developer's group is not mapped to a role. Provision the group first, then map it — an unmapped identity resolves to least privilege by design.
sso:configure denied
The OIDC configuration and group-to-role mapping endpoints are privilege grants,
so they require the sso:configure permission and are deliberately not reachable
with a SCIM directory-sync token.
