Rootproof

Idioma

Tema

Setup guide · Advanced

SSO con OpenID Connect

Permite que tu equipo inicie sesión con el IdP corporativo (Auth0, Okta, Microsoft Entra, Google Workspace, Keycloak). El OTP magic-link sigue funcionando como respaldo.

Requisitos: plan Advanced activo + rol admin en la org. Si tu plan aún no es Advanced, escribinos desde /demo.

Modelo de confianza

Rootproof actúa como relying party (RP). Tu IdP autentica al usuario, firma un ID token y nos devuelve el email verificado vía el endpoint userinfo. Si el email matchea un miembro de tu org (o cumple el allowlist de dominio cuando está activado el auto-provisioning), creamos una sesión org_member_sessioncon el rol correspondiente.

Paso a paso (genérico)

  1. 01

    Registrá una app OIDC en tu IdP

    Creá una aplicación tipo Web / Regular Web App / Confidential client. Configurá:

    • Redirect URI: https://rootproof.io/api/auth/sso/<tu-slug>/callback
    • Allowed scopes: openid email profile
    • Grant type: authorization_code (con PKCE)
    • Response type: code
  2. 02

    Copiá las credenciales

    De tu IdP necesitás tres valores:

    • Issuer URL — la base del IdP, ej. https://tu-tenant.auth0.com/
    • Client ID
    • Client Secret

    Rootproof descubre los endpoints automáticamente desde <issuer>/.well-known/openid-configuration. Si tu IdP expone el discovery en otra ruta, podés sobrescribirlo en el formulario.

  3. 03

    Pegalas en el dashboard de Rootproof

    Andá a /org/<tu-slug> → tab Perfil → sección Ajustes EnterpriseSSO (OpenID Connect).

    Llená los campos, guardá, y dejá el checkbox Habilitar SSO activado.

    Al guardar, Rootproof valida la discovery URL contra tu IdP. Si responde 404 o devuelve JSON inválido vas a ver un warning — no pasa nada, podés corregir el issuer y volver a guardar.

  4. 04

    (Opcional) Restringí por dominio + auto-provisión

    Dominios permitidos: si dejás vacío, cualquier email autenticado por tu IdP es aceptado. Si listás universidad.edu, alumnos.universidad.edu, solo esos dominios pueden iniciar sesión.

    Auto-provisión: cuando está activado, el primer login de un email que matchea el allowlist crea automáticamente un member con el rol por defecto (recomendado: viewer; promové manualmente a issuer / admin después).

    Cuando está desactivado, solo los emails ya invitados desde Equipo pueden iniciar sesión. Cualquier otro email autenticado recibe un 403 educado.

  5. 05

    Probá el login

    En una ventana incógnito, andá a https://rootproof.io/org/<tu-slug>/login. Deberías ver un botón nuevo "Iniciar sesión con tu proveedor SSO" debajo del input de contraseña.

    El botón te redirige al IdP, autenticás, y volvés a Rootproof ya logueado como member con el rol que corresponda. El OTP magic-link sigue disponible como respaldo si el IdP tiene un outage.

Recetas por IdP

Auth0

  1. Dashboard Auth0 → Applications → Create Application → Regular Web Application.
  2. Settings → Allowed Callback URLs: https://rootproof.io/api/auth/sso/<slug>/callback
  3. Connections → habilitá las bases de datos / proveedores sociales que querés permitir.
  4. Copiá Domain (eso es el issuer, prefijalo con https:// y barra final), Client ID y Client Secret.

Okta

  1. Admin Console → Applications → Create App IntegrationOIDC - OpenID ConnectWeb Application.
  2. Sign-in redirect URIs: https://rootproof.io/api/auth/sso/<slug>/callback
  3. Asignar la app a los grupos / usuarios que pueden entrar.
  4. Issuer URL: https://<tu-tenant>.okta.com

Microsoft Entra (Azure AD)

  1. Entra admin center → App registrations → New registration.
  2. Redirect URI: Web → https://rootproof.io/api/auth/sso/<slug>/callback
  3. Certificates & secrets → New client secret.
  4. API permissions → agregá openid, email, profile (Microsoft Graph delegated).
  5. Issuer URL: https://login.microsoftonline.com/<tenant-id>/v2.0

Google Workspace

  1. Google Cloud Console → APIs & Services → Credentials → Create OAuth client ID.
  2. Application type: Web application.
  3. Authorized redirect URI: https://rootproof.io/api/auth/sso/<slug>/callback
  4. OAuth consent screen: configurá los scopes openid, email, profile.
  5. Issuer URL: https://accounts.google.com
  6. En "Dominios permitidos" en Rootproof, listá los dominios de Workspace que querés permitir (clave para no aceptar Gmail personal).

Keycloak / Authentik / cualquier OIDC estándar

Cualquier IdP que exponga /.well-known/openid-configuration y soporte PKCE funciona out-of-the-box. En Keycloak: Clients → Create → Protocol openid-connect, Access Type confidential, Valid Redirect URIs apuntando al callback.

Troubleshooting

Si el callback falla, Rootproof te redirige a /org/<slug>/login?error=<code>. Estos son los códigos:

sso-bad-state         → el state expiró (>10 min) o fue manipulado
sso-missing-code      → el IdP no devolvió "code" en la callback URL
sso-not-configured    → falta issuer / client_id / client_secret en la org
sso-not-member        → email autenticado pero no figura en org.members (sin autoprov.)
sso-email-unverified  → el IdP reportó email_verified: false
sso-email-domain      → email autenticado fuera del allowlist de dominios
sso-no-email          → userinfo no incluyó el claim email — habilitá el scope
sso-plan-required     → la org no está en plan Advanced
sso-org-not-found     → slug no existe o la org está desactivada

Preguntas frecuentes

¿Soportan SAML además de OIDC?
Hoy solo OIDC. SAML está en el backlog — escribinos si lo necesitás para que lo priorizemos. Todos los IdP de empresa (Okta, Entra, Auth0, Keycloak) ofrecen OIDC en paralelo a SAML, así que esta restricción rara vez es bloqueante.
¿Verifican la firma del ID token con JWKS?
Hoy no. Hacemos code-exchange contra el token endpoint descubierto y consultamosuserinfo sobre TLS — el certificado del IdP es el trust anchor para el email. Si tu equipo de seguridad requiere verificación JWS offline, levantanos un ticket y activamos la validación con jose + JWKS para tu org.
¿Pueden los miembros existentes seguir usando el OTP magic-link?
Sí. SSO y OTP coexisten. El OTP es valioso como respaldo si el IdP tiene un outage o si necesitás dar acceso temporal a un auditor externo sin crearle cuenta corporativa.
¿Qué pasa si rotamos el client_secret en el IdP?
Pegá el nuevo secret en el formulario y guardá. El campo vacío significa "mantener el existente"; un valor no vacío lo reemplaza atómicamente. Cualquier sesión SSO ya emitida sigue siendo válida hasta su expiración natural (7 días).

¿Tu IdP no está en la lista o el flujo no funciona? Mandanos un mail a security@rootproof.io con el nombre del IdP y los logs del callback — respondemos en 24 h hábiles.