You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
Stand the stack up behind a public HTTPS tunnel (cloudflared), SITE_URL = tunnel origin so all SSO callbacks/ACS/SCIM URLs are publicly reachable.
Configure a real Entra tenant: App registration(s) for OIDC + OAuth2, an Enterprise App for SAML, and SCIM provisioning.
Run the E2E matrix below; post the full test report to this Epic.
Fix every confirmed issue (code + i18n in all locales + co-located regression tests).
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.
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 inservices/platform/convex/scim/. Public endpoints exercised by the IdP:POST /api/sso/discover,GET /api/sso/authorize,GET /api/sso/callback(IdP redirect URI),GET /api/sso/set-sessionGET /api/sso/saml/metadata,GET /api/sso/saml/login,POST /api/sso/saml/acs(IdP reply/ACS URL)/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)
POST /Usersfor an email owned by another org grafts a cross-tenant membership and renames that user?redirect=reflected with no origin validation)🟠 Correctness (P2)
Error🟡 UX / hardening (P3)
undefined)throw new Erroracross auth/SSO/tasks/conversations/project-metrics) #2049 — Standardize client-facing backend failures onConvexError(sweep rawthrow new Erroracross auth/SSO/tasks/conversations/project-metrics)🔵 Feature baseline
Plan
SITE_URL= tunnel origin so all SSO callbacks/ACS/SCIM URLs are publicly reachable.E2E test matrix
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.