https://<name>.auth.didit.mepara una aplicación de producción,https://<name>.sandbox.auth.didit.mepara una aplicación de sandbox,- o tu propio dominio personalizado, una vez que esté activo.
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.Descubrimiento y claves
El emisor admite:
- Tipo de respuesta
codey modo de respuestaquery. - Tipos de concesión
authorization_codeyrefresh_token. - Solo el método PKCE
S256. Los clientes son públicos: no hay secreto de cliente yclient_ides el ID de tu aplicación. - Algoritmo de firma
ES256(claves P-256). - Scopes
openid,email,phone,profileyoffline_access.
prompt=none. Usa GET /session/ para leer y comprobar una sesión.
Caché y rotación
Ambos documentos incluyenCache-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 pork_. Cada token indica su clave en el encabezadokid. - 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 unkidque 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 elauthorization_endpoint:
Las guías de inicio rápido construyen esta solicitud por ti.
Intercambiar el código
El callback recibecode 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 encabezadoalg: 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:algesES256ytypesat+jwt. Rechaza cualquier otro algoritmo, incluidonone.- El
kidestá en el JWKS de tu aplicación y la firma se verifica. isses igual al emisor que configuraste yaudes igual al ID de tu aplicación.expeiatson válidos, con un margen de hasta 60 segundos de diferencia de reloj, ysub,sidyjtiestán presentes.actesnull. El token de acceso de un agente de IA se firma con la misma clave y lleva los mismostyp,issyaud; soloactlo distingue. Recházalo, salvo que el endpoint acepte agentes: en ese caso, permite solo lo que concedaact.scopes.GET /session/siempre rechaza el token de un agente.
GET /session/.
Comprobar la sesión
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
- 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 invocarGET /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
400o 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
429antes de ejecutar la actualización, así que reintenta después deRetry-After. El endpoint de tokens admite 30 solicitudes por minuto y 300 por hora por dirección IP. Además, todas las solicitudesPOSTyDELETEde 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) oidle_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_changeestá 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.