Skip to content

docs(access-management): document SCIM provisioning and user groups - #84388

Draft
Ian Alton (ian-at-airbyte) wants to merge 4 commits into
masterfrom
devin/1786658513-scim-user-groups-docs
Draft

docs(access-management): document SCIM provisioning and user groups#84388
Ian Alton (ian-at-airbyte) wants to merge 4 commits into
masterfrom
devin/1786658513-scim-user-groups-docs

Conversation

@ian-at-airbyte

@ian-at-airbyte Ian Alton (ian-at-airbyte) commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

What

Public-facing documentation for SCIM v2 provisioning and user groups, requested by Ian Alton in DOCS-74.

New pages:

  • access-management/scim.md — concepts, prerequisites, enable flow, token handling, disable/re-enable, supported SCIM surface, lifecycle behavior, troubleshooting.
  • access-management/user-groups.md — what a group is, the identity-provider/Airbyte ownership split, assigning permissions, how permissions combine.
  • access-management/scim-providers/okta.md and .../azure-entra-id.md — provider setup (Okta app integration, Entra custom non-gallery app).

All four pages are products: cloud-teams, which renders Pro + Enterprise Flex badges. Per the ticket, existing SSO and RBAC content isn't duplicated — the surrounding pages only get pointers.

How

Behavior was taken from the implementation in airbyte-platform-internal rather than the technical spec, per the ticket. The claims that a reviewer should sanity-check hardest:

  • Domain verification is a prerequisite the ticket doesn't mention. POST /Users is rejected unless the organization holds a verified organization_domain_verification record for that email domain, so the docs make SSO + domain verification a hard prerequisite.
  • Deactivation is destructive and reactivation is not symmetric. Deactivate or delete removes organization permissions, all workspace permissions, and all group memberships in that organization; reactivation restores only organization_member. Workspace roles, elevated organization roles, and group memberships must be re-established.
  • SCIM doesn't gate sign-in. Deactivation is scoped to the provisioning organization, and whether a person signs in through SSO follows from SSO domain verification, not from SCIM — so someone in several organizations keeps reaching the ones that use neither.
  • The group lock is per group, not org-wide. A group only becomes read-only once it has a SCIM mapping: mapped groups can't be renamed or have membership changed while SCIM is enabled, and can't be deleted in Airbyte while the mapping exists (even after disabling). Groups that were never mapped stay editable. Because an IdP can't adopt a same-named existing group (409), the enable flow now opens with a warning to clear out pre-existing groups first.
  • Ownership split: the identity provider owns group names and membership; Airbyte owns group permissions, and SCIM cannot carry them.
  • Tokens: airbyte_scim_<64 hex>, shown once, no expiry, rotation invalidates the previous token immediately with no grace period. Docs tell admins to copy the SCIM base URL Airbyte displays instead of hard-coding a host, since it's derived from AIRBYTE_URL.
  • Limits: core User/Group schemas, PATCH and filtering supported, no bulk/sort/ETag/password sync/nested groups. Page size is 100 resources per response by default with a requested count clamped to 200 — a response page size, not a ceiling on how many users or groups can be provisioned.

Review guide

  1. docs/platform/access-management/scim.md — the anchor page; everything else defers to it.
  2. docs/platform/access-management/user-groups.md
  3. docs/platform/access-management/scim-providers/okta.md, .../azure-entra-id.md
  4. The four surgical edits: rbac.md, sso.md, role-mapping.md, and the two existing SSO provider guides, where SCIM is linked from its own optional section rather than as a trailing next step.
  5. docusaurus/sidebar-platform.js

Needs confirmation before this publishes

These features are still in development, so the affected passages are written to what's shipped today and should be re-checked when the work lands:

  • PLAT-1118 (permissions-only edit modal) — the "Assign permissions to a group" steps are deliberately shallow, with an HTML comment marking the spot.
  • PLAT-1106 — organization roles are read-only on the Members page under SCIM today; this is expected to change.
  • PLAT-1094 — the docs currently say a SCIM-mapped group can't be deleted in Airbyte while its mapping exists, including after SCIM is disabled, which is what GroupServiceDataImpl enforces today.
  • PLAT-1097 — the existing-groups warning; the docs carry it in the enable section and on the user groups page rather than relying on an in-product warning.
  • PLAT-945 covers the same customer-facing Okta/Entra ground from the platform side.

Provider UI navigation in the two SCIM provider guides is written at a level defensible from Airbyte's code plus Okta's and Microsoft's public docs, and points to those docs rather than prescribing edition-specific menu paths. HTML comments in each file list what still needs a pass against a live tenant.

Also unverified: whether SCIM's effect on a pending Airbyte invitation is anything at all — no interaction exists in the code, so the docs make no claim.

User Impact

Pro and Enterprise Flex customers get setup and behavior documentation for SCIM and user groups where none existed. Docs-only change; no product behavior changes.

Can this PR be safely reverted and rolled back?

  • YES 💚
  • NO ❌

Test plan

pnpm build from docusaurus/ passes (pnpm 9.4.0 via Corepack; the system pnpm is incompatible with the lockfile). The build is the real gate here since Docusaurus fails on broken links, and every new link target and sidebar ID was checked. The pre-existing broken-anchor warnings elsewhere in the docs are unchanged. MarkdownLint and Vale weren't available locally, so the Vercel preview is worth a look for rendering of the new sidebar category.

Link to Devin session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a
Requested by: Ian Alton (ian.alton@airbyte.io)

Requested by: Ian Alton (@ian-at-airbyte)

devin-ai-integration Bot and others added 2 commits August 13, 2026 22:12
Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

Copy link
Copy Markdown
Contributor

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
      • Bump types: patch (default), minor, major, major_rc, rc, promote.
      • The rc type is a smart default: applies minor_rc if stable, or bumps the RC number if already RC.
      • The promote type strips the RC suffix to finalize a release.
      • Example: /bump-version type=rc or /bump-version type=minor
    • /bump-progressive-rollout-version - Alias for /bump-version type=rc. Bumps with an RC suffix and enables progressive rollout.
  • ❇️ AI Testing and Review (internal link: AI-SDLC Docs):
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 📝 AI Documentation:
    • /ai-docs-review - AI-powered documentation review for PRs with connector changes.
    • /ai-create-docs-pr - Creates a documentation PR for connector changes, stacked on the current PR.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
    • /enable-autopilot-rollouts - Enables autopilot progressive rollouts for the modified connector(s) in the PR, remediating "autopilot rollouts not enabled for {connector-name}" auto-merge blockers. Sets defaultRolloutMode: autopilot and enableProgressiveRollout: true, preserving any existing autopilotConfig.
      • Optional args: connector=<CONNECTOR_NAME> (defaults to the modified connectors in the PR), strategy=fast|slow|default (defaults to fast).
      • Example: /enable-autopilot-rollouts or /enable-autopilot-rollouts connector=source-faker strategy=slow
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Deploy preview for airbyte-docs ready!

Project:airbyte-docs
Status: ✅  Deploy successful!
Preview URL:https://airbyte-docs-iygjvr07y-airbyte-growth.vercel.app
Latest Commit:727ebe9

Deployed with vercel-action


5. Click **Activate SSO**. -->

For the next step, see [Set up SCIM using Entra ID](../scim-providers/azure-entra-id).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Place this under its own heading. It's not necessarily a logical next step if you're not using SCIM.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it. Same fix as the Okta page — own optional heading, not a trailing "next step".

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in b1a761d. Same optional section here.


5. Click **Activate SSO**. -->

For the next step, see [Set up SCIM using Okta](../scim-providers/okta).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Place this under its own heading. It's not necessarily a logical next step if you're not using SCIM.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it. Moving it out of the SSO flow and under its own optional heading so it doesn't read as a required next step.

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in b1a761d. SCIM now lives under its own ## Optional: Add SCIM provisioning section that says SSO works without it.

Comment thread docs/platform/access-management/scim.md Outdated
- Password synchronization. Airbyte ignores any password your IdP sends.
- Bulk operations, sorting, and ETags.

Airbyte returns at most 200 resources per page and 100 by default, so configure your IdP to page through results.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to be clear, we're talking about the maximum size of the user base that Airbyte is able to sync from the idp at once?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it — and no, it's not a cap on the user base. This is response page size only: Airbyte's SCIM list endpoints return 100 resources per page by default and clamp a requested count to 200, and the IdP walks the rest with startIndex. There's no limit on how many users or groups you can provision in total. Rewriting the sentence to say that explicitly.

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in b1a761d. Now states it's the size of a single SCIM response page, that a requested count above 200 gets clamped, that the IdP requests further pages, and that it doesn't limit how many users or groups you can provision.

After you reactivate someone, your IdP must re-add them to their groups, and an organization admin must re-grant any individual roles they had. Otherwise, they can sign in but only see what an organization member sees.
:::

## Provision users who already have Airbyte accounts

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if someone is a member of multiple organizations, but one or more of those organizations doesn't use SCIM or SSO? Are they able to continue to sign in?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it. Yes, they keep signing in — SCIM never gates authentication. It issues no credentials, and deactivation is scoped to the provisioning organization: it removes that org's permissions, its workspace permissions, and its group memberships, and leaves the account and every other org's access alone.

What can force a sign-in path is SSO domain enforcement, not SCIM. UserHandler.handleSSORestrictions/isAllowedDomain rejects a login with SSORequiredProblem when the user's email domain is claimed by an SSO organization and the session didn't come through that organization's SSO realm (gated by the RestrictLoginsForSSODomains flag). That's a property of the account's email domain, so someone whose domain is claimed has to come in through that org's SSO — and once in, the same account still reaches their non-SSO orgs normally.

Adding a short "people in more than one organization" note to the lifecycle section that says this, and pointing at SSO rather than implying SCIM is what restricts login.

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in 727ebe9. New "People in multiple organizations" subsection in the lifecycle section: SCIM doesn't control sign-in, deactivation is scoped to the provisioning organization, and whether someone signs in with SSO follows from SSO domain verification rather than SCIM — with the same account still reaching organizations that use neither.


Set up SSO before SCIM. Users your IdP provisions can only sign in with the credentials your IdP manages.

## Enable SCIM in Airbyte

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's worth starting this discussion with a warning that you should delete user groups before enabling SCIM. As I understand it, once SCIM is enabled, user groups are managed fully by the IDP and you can't later delete or modify groups that aren't being managed by the IDP.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it — adding that warning before the enable steps. One correction to the mechanism, because the code makes the recommendation slightly narrower than "everything locks":

The lock is per group, keyed on whether that group has a SCIM mapping (GroupServiceDataImpl.verifyAirbyteMutationAllowed), not org-wide. So:

  • Groups that predate SCIM and never get mapped stay fully renamable, editable, and deletable in Airbyte even while SCIM is on.
  • Any group your IdP created or adopted can't be renamed or have its membership changed while SCIM is enabled, and can't be deleted in Airbyte at all while the mapping exists — including after you disable SCIM (that's PLAT-1094).
  • Your IdP can never adopt a same-named pre-existing group: creation keeps failing with 409 until the Airbyte group is renamed or deleted.

The advice still lands the same way — clear out pre-existing groups first — so I'll say that up front and give the 409 as the reason rather than claiming the old groups become uneditable.

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in b1a761d. Warning added directly under Enable SCIM in Airbyte, before step 1: clear out or rename groups your IdP should provision, with the 409 as the reason and the mapped-group lock (no rename or membership change while SCIM is on, no deletion while the mapping exists — including after disabling) spelled out. It also says never-mapped groups stay editable, so nobody reads it as "everything freezes". The disable/re-enable list picked up the matching clause.

While SCIM is enabled, you can't rename a group, change its membership, or delete it in Airbyte. Make those changes in your identity provider instead.

:::warning
Your identity provider can't adopt an existing Airbyte group with the same name. Provisioning for that group fails with a `409` response until you rename or delete the Airbyte group.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made a similar comment on the scim.md article, but basically, I think we should encourage people to delete existing user groups before enabling SCIM. This avoids a number of problems, including the one you outline here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 On it. Adding the "delete pre-existing groups before you enable SCIM" recommendation here too, with the enable-flow warning in scim.md as the primary home and this page keeping the 409 collision detail. See my reply on that thread for the one place the mechanism differs from your description — unmapped legacy groups do stay editable; it's the mapped ones that lock.

Session: https://app.devin.ai/sessions/e30c3d6fb324419f9478107e8ad9cc1a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

☑️ Resolved in b1a761d. This page now carries the recommendation alongside the 409 detail and links to the enable section for the full guidance.

devin-ai-integration Bot and others added 2 commits August 14, 2026 02:49
Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant