Skip to content

Epic: Enterprise SSO + SCIM end-to-end hardening (Microsoft Entra) #2116

Description

@yannickmonney

Summary

Tracking Epic consolidating all open Enterprise SSO + SCIM defects and improvements, to be validated end-to-end against a real Microsoft Entra ID tenant across every supported method (generic OIDC, generic OAuth2, Entra-native, SAML 2.0) plus SCIM 2.0 provisioning/de-provisioning.

The Enterprise SSO stack is a custom in-house implementation (not Better Auth's SSO plugin), in services/platform/convex/enterprise_sso/, with SCIM in services/platform/convex/scim/. Public endpoints exercised by the IdP:

  • OIDC / OAuth2: POST /api/sso/discover, GET /api/sso/authorize, GET /api/sso/callback (IdP redirect URI), GET /api/sso/set-session
  • SAML 2.0: GET /api/sso/saml/metadata, GET /api/sso/saml/login, POST /api/sso/saml/acs (IdP reply/ACS URL)
  • SCIM 2.0: /scim/v2/{ServiceProviderConfig,ResourceTypes,Schemas,Users,Groups,…} (bearer-token, org resolved from token)

Adapters: entra_id/, generic_oidc/, oauth2/, plus SAML.

Consolidated scope

🔴 Security (P1)

🟠 Correctness (P2)

🟡 UX / hardening (P3)

🔵 Feature baseline

Plan

  1. Stand the stack up behind a public HTTPS tunnel (cloudflared), SITE_URL = tunnel origin so all SSO callbacks/ACS/SCIM URLs are publicly reachable.
  2. Configure a real Entra tenant: App registration(s) for OIDC + OAuth2, an Enterprise App for SAML, and SCIM provisioning.
  3. Run the E2E matrix below; post the full test report to this Epic.
  4. Fix every confirmed issue (code + i18n in all locales + co-located regression tests).
  5. Re-run unit + live E2E; open a PR linking every sub-issue + this Epic and drive CI green.

E2E test matrix

Method First-login provision Role / team mapping Session established SCIM create SCIM update SCIM group SCIM de-provision
Generic OIDC
Generic OAuth2
Entra-native (group sync)
SAML 2.0

Results filled in by the test report once the live run completes.


Test methodology: Playwright-driven Azure portal configuration + Playwright-driven Tale login flows, against a live Entra tenant over a cloudflared tunnel.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions