Skip to content

docs: add Enterprise section with SAML SSO setup guide - #633

Merged
easymac merged 2 commits into
mainfrom
docs/enterprise-saml
Aug 28, 2026
Merged

docs: add Enterprise section with SAML SSO setup guide#633
easymac merged 2 commits into
mainfrom
docs/enterprise-saml

Conversation

@eseidel

@eseidel eseidel commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Adds a new top-level Enterprise section with two pages, wired into the sidebar between Account and System.

enterprise/index.mdx

Short overview of what the Enterprise plan covers — SAML SSO, the full role set including App Manager, invoice billing and procurement, higher patch volume — linking to the existing Billing and Organizations pages.

enterprise/saml.mdx

SAML is not self-serve yet, so this page is written around what a customer needs to send us so we can create the connection by hand. Content is derived from the actual implementation (saml.server.ts, the auth.saml.* routes, and the admin saml._index.tsx form):

  • What to send Shorebird — email domain, IdP entity ID, IdP SSO URL, and X.509 signing certificate. These are exactly the customer-supplied fields on the admin connection form, and all four are required (idp_certificate is NOT NULL). Sending the IdP metadata URL instead is offered as the shortcut.
  • Settings to configure on the IdP — ACS URL https://auth.shorebird.dev/auth/saml/callback (the prod default; only dev overrides SAML_CALLBACK_URL), audience URI, Name ID format, blank RelayState, response and assertion signed, and that we send unsigned AuthnRequests.
  • The required email attribute statement gets its own section — node-saml only populates profile.email from email, mail, or the OID, so a missing attribute statement is the most likely setup failure.
  • Okta walkthrough with links to Okta docs (all link targets verified to return 200).
  • Limits that fall out of the implementation — SP-initiated only (the callback requires signed RelayState, so IdP-initiated tiles won't work), one connection per email domain with the assertion email domain enforced, SSO separate from org membership, one-hour assertion age with 60s skew.

Worth a look, @easymac

The page tells customers to name any members who already have a Shorebird account created via Google or Microsoft at the same domain, since adoptOrReject throws wrong_provider when the issuer differs and their first SSO sign-in will fail. The doc frames that as something to mention in the email; the migration itself is a manual step on our side. Let me know if you'd rather word that differently or leave it out.

Also adds Okta to the Vale sentence-case heading exceptions.

npm run build passes with all internal links valid, and cspell is clean. I couldn't run Vale locally (the @vvago/vale binary isn't installed in this checkout), so the three custom rules were checked by hand — CI will confirm.

Adds a new top-level Enterprise section with an overview page and a SAML
single sign-on page.

SAML is not self-serve yet, so the SSO page is written around what a
customer needs to send Shorebird to have a connection created by hand:
the email domain, IdP entity ID, IdP SSO URL, and X.509 signing
certificate, which are exactly the customer-supplied fields on the admin
SAML connection form. It also documents the values to configure on the
IdP side (ACS URL, audience URI, Name ID format, signing requirements),
the required `email` attribute statement without which sign-in fails,
Okta-specific steps with links to Okta's docs, and the behavioral limits
that fall out of the implementation: SP-initiated sign-in only, one
connection per email domain, and SSO being separate from organization
membership.

Adds "Okta" to the Vale sentence-case heading exceptions.

Claude-Session: https://claude.ai/code/session_01GsTSRKxu4GHV2K3ZL4Z26s
@eseidel
eseidel requested a review from easymac August 28, 2026 16:55

@easymac easymac left a comment

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.

👍 Looks good, checked for accuracy with our config process. Wondering whether we should exclude all of the limitations/non-supported flows? People asking for them is data for us? Don't want to confuse or surprise anyone, but not sure whether we're better off with a preemptive "no" vs hearing them ask for something. No real opinion.

@eseidel

eseidel commented Aug 28, 2026 via email

Copy link
Copy Markdown
Contributor Author

@easymac
easymac merged commit f9e3987 into main Aug 28, 2026
5 checks passed
@easymac
easymac deleted the docs/enterprise-saml branch August 28, 2026 20:59
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.

2 participants