Saltar al contenido principal
La autenticación es una función nueva. Todas las llamadas de esta página usan credenciales del usuario final o ninguna. Nunca envíes tu clave de API de verificación ni un token de la consola a estos endpoints.
Cada aplicación es su propio emisor de OpenID Connect. El emisor es el origen de inicio de sesión de tu aplicación:
  • https://<name>.auth.didit.me para una aplicación de producción,
  • https://<name>.sandbox.auth.didit.me para una aplicación de sandbox,
  • o tu propio dominio personalizado, una vez que esté activo.
Producción y sandbox son emisores distintos con claves distintas. Asigna a DIDIT_AUTH_ISSUER tu emisor, sin barra final, y a DIDIT_APPLICATION_ID el ID de tu aplicación: los tokens lo incluyen como aud. Tu clave publicable codifica el emisor: después de pk_live_ o pk_test_, contiene el emisor en base64url sin relleno.
Cuando tu dominio personalizado se activa, sustituye al host predeterminado como emisor. Los tokens nuevos lo indican en iss, el documento de descubrimiento apunta jwks_uri a él y tu clave publicable cambia. A partir de ese momento, los tokens de acceso emitidos con el host predeterminado no funcionan con GET /session/ hasta que se renuevan. Actualiza DIDIT_AUTH_ISSUER cuando actives el dominio, o acepta ambos emisores hasta que expiren los tokens anteriores, en un máximo de 5 minutos.
Los endpoints de servidor de esta página (descubrimiento, claves, tokens y sesión) están en la referencia de la API de autenticación, generada a partir de openapi-authentication.json. La página de inicio de sesión alojada no forma parte de la referencia.

Descubrimiento y claves

El emisor admite:
  • Tipo de respuesta code y modo de respuesta query.
  • Tipos de concesión authorization_code y refresh_token.
  • Solo el método PKCE S256. Los clientes son públicos: no hay secreto de cliente y client_id es el ID de tu aplicación.
  • Algoritmo de firma ES256 (claves P-256).
  • Scopes openid, email, phone, profile y offline_access.
No hay endpoints de userinfo, introspección ni cierre de sesión, y no se admite prompt=none. Usa GET /session/ para leer y comprobar una sesión.

Caché y rotación

Ambos documentos incluyen Cache-Control: public, max-age=300, así que tú y las cachés compartidas pueden conservarlos durante 5 minutos. Admiten 1.200 solicitudes por minuto y 12.000 por hora por dirección IP, muy por encima de los endpoints de inicio de sesión, porque muchas instancias de backend suelen compartir una misma dirección.
  • Cada clave tiene un kid; los nuevos ID de clave empiezan por k_. Cada token indica su clave en el encabezado kid.
  • Las claves rotan cada 30 días. Didit publica la siguiente clave un día antes de que empiece a firmar y mantiene publicada la clave anterior durante un día después de que deje de hacerlo. Por eso, un JWKS en caché durante 5 minutos sigue verificando a lo largo de una rotación.
  • Guarda las claves en caché por kid. Cuando un token indique un kid que no tienes, vuelve a obtener el JWKS, como máximo una vez por minuto, y rechaza el token si la clave sigue sin aparecer.
  • Cuando Didit revoca una clave comprometida, la elimina del JWKS de inmediato, y GET /session/ rechaza todos los tokens firmados con esa clave. Una clave de reemplazo empieza a firmar inmediatamente, sin el día de publicación anticipada. Un JWKS guardado en caché hasta 5 minutos antes sigue aceptando la clave revocada y todavía no conoce la de reemplazo, por lo que los tokens nuevos pueden fallar la verificación sin conexión hasta que la caché se actualice.

Iniciar sesión

Abre la página alojada, que es el authorization_endpoint:
Las guías de inicio rápido construyen esta solicitud por ti.

Intercambiar el código

El callback recibe code y state. Comprueba state y, después, intercambia el código en un plazo de 60 segundos. Cada código solo se puede usar una vez. El cuerpo puede ser JSON o estar codificado como formulario.
expires_in indica los segundos que le quedan al token de acceso. Si desactivas las sesiones múltiples, este intercambio cierra las demás sesiones de la persona.

Claims del token de acceso

El token de acceso es un JWT con el encabezado alg: ES256 y typ: at+jwt. Dura como máximo 5 minutos y nunca más que su sesión. El token de ID tiene el encabezado typ: JWT. Lleva los mismos claims salvo client_id, además de auth_time y email_verified, y email, name y phone_number cuando tienen valor. Solo el token de ID del intercambio del código lleva nonce, cuando el inicio de sesión tenía uno: compruébalo ahí, porque los tokens de ID de una actualización nunca lo llevan. Un token de ID nunca se acepta como token de acceso.

Verificar un token en tu servidor

Comprueba todo lo siguiente antes de confiar en un claim:
  1. alg es ES256 y typ es at+jwt. Rechaza cualquier otro algoritmo, incluido none.
  2. El kid está en el JWKS de tu aplicación y la firma se verifica.
  3. iss es igual al emisor que configuraste y aud es igual al ID de tu aplicación.
  4. exp e iat son válidos, con un margen de hasta 60 segundos de diferencia de reloj, y sub, sid y jti están presentes.
  5. act es null. El token de acceso de un agente de IA se firma con la misma clave y lleva los mismos typ, iss y aud; solo act lo distingue. Recházalo, salvo que el endpoint acepte agentes: en ese caso, permite solo lo que conceda act.scopes. GET /session/ siempre rechaza el token de un agente.
Toma el emisor de tu configuración, nunca del token.
La verificación offline no puede detectar una sesión que terminó hace un momento. Cuando eso importe, por ejemplo antes de un pago, llama a GET /session/.

Comprobar la sesión

La respuesta contiene sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri y organizations. Cada entrada de organización tiene organization_id, organization__name, role y custom_role. Esta comprobación es más estricta que la verificación offline. También falla cuando la sesión se revocó, quedó inactiva o superó su duración, cuando la persona fue bloqueada o su correo electrónico ya no está verificado, cuando la sesión ya no cumple tu política de MFA (por ejemplo, después de que la persona añadiera una app de autenticación o pasara a ser administradora de una organización), o cuando el token se renovó. Un fallo devuelve 401 {"detail": "invalid_token"} con WWW-Authenticate: Bearer. GET /session/ admite 30 solicitudes por minuto y 300 por hora por dirección IP, un límite que comparte con DELETE /session/. Verifica los tokens offline en cada solicitud y reserva esta llamada para los momentos que la necesiten. Cada llamada exitosa cuenta como actividad, así que reinicia el idle_timeout de la sesión. Un correo electrónico verificado no es una verificación de identidad. Para eso, lee verified: aquí es null cuando no hay ninguna, mientras que los tokens llevan {}.

Tokens de actualización

Una actualización devuelve un nuevo token de acceso, un nuevo token de ID y un nuevo token de actualización, y el token de actualización que enviaste deja de funcionar.
  • El token de actualización es una cadena aleatoria, válida hasta que termina la sesión.
  • Reutilizarlo termina la sesión. Cuando vuelve a llegar un token de actualización ya usado, Didit lo trata como una señal de robo: revoca la sesión y devuelve 400 {"error": "invalid_grant"}. Los tokens de la sesión también dejan de funcionar, incluidos los de la actualización anterior: el token de actualización deja de funcionar y el token de acceso deja de funcionar de inmediato al invocar GET /session/, aunque sigue verificándose offline hasta que expira, en un plazo de 5 minutos.
  • Ejecuta una sola actualización a la vez por sesión, en todas las pestañas, dispositivos e instancias de servidor, y sustituye los tres tokens a la vez.
  • Si una actualización falla con 400 o no obtienes respuesta, vuelve a iniciar sesión. No la reintentes a ciegas: reintentar una actualización que sí se completó es una reutilización.
  • Un 503 {"error": "temporarily_unavailable"} significa que la actualización no se realizó y que tu token de actualización sigue funcionando. Vuelve a intentarlo con backoff.
  • Didit responde con un 429 antes de ejecutar la actualización, así que reintenta después de Retry-After. El endpoint de tokens admite 30 solicitudes por minuto y 300 por hora por dirección IP. Además, todas las solicitudes POST y DELETE de tu aplicación comparten los contadores de protección contra bots: 60 solicitudes por minuto por dirección IP entre esos endpoints, 30 por minuto por dispositivo y 1,000 por minuto para toda la aplicación, incluidos los navegadores y los pasos de inicio de sesión.
  • Con tokens de acceso de 5 minutos, 300 actualizaciones por hora cubren a unas 25 personas que se mantienen activas. Si tu servidor actualiza tokens para muchas personas desde una misma dirección, actualiza solo cuando una solicitud necesite un token nuevo y, cuando puedas, hazlo en el navegador o en la app.

Cerrar sesión

DELETE /session/ con el token de acceso actual de la persona finaliza la sesión y devuelve 204. Su token de actualización deja de funcionar y sus tokens de acceso dejan de ser válidos para GET /session/ de inmediato; los tokens que verificas sin conexión siguen siendo válidos hasta que expiran. Después, envía a la persona a tu post_logout_redirect_uri, si configuraste uno. Para cerrar sesión se necesita un token de acceso que GET /session/ aceptaría: uno que no haya expirado ni haya sido reemplazado tras renovar el token. Un 401 significa que la sesión no finalizó. Renueva el token y luego cierra sesión con el nuevo token de acceso; si la renovación falla con 400, la sesión ya no se puede usar. Una sesión también finaliza cuando:
  • supera session_lifetime (30 días por defecto) o idle_timeout (1 día por defecto),
  • la persona vuelve a iniciar sesión cuando no se permiten varias sesiones,
  • la persona restablece su contraseña mientras revoke_on_password_change está activado,
  • tu equipo la revoca o bloquea a la persona en la consola,
  • se vuelve a enviar un token de actualización ya usado.

Duración

Guarda las credenciales según su propósito

  • Guarda las claves de API de verificación y los tokens de la consola en tu servidor.
  • Guarda los tokens de acceso del navegador en memoria siempre que sea posible. En aplicaciones renderizadas en el servidor, usa cookies seguras HttpOnly y protege contra CSRF las solicitudes autenticadas con cookies.
  • Guarda los tokens de actualización en aplicaciones móviles en el almacenamiento protegido por la plataforma. Borra el estado local después de cerrar sesión.
  • Nunca pongas tokens en las URL ni en los logs.
Continúa con la guía de inicio rápido de JavaScript, la guía de inicio rápido de Next.js o la referencia de la API de autenticación.
Última modificación el 1 de noviembre de 2026