https://<name>.auth.didit.mepour une application de production,https://<name>.sandbox.auth.didit.mepour une application sandbox,- ou votre propre domaine personnalisé, une fois qu’il est actif.
DIDIT_AUTH_ISSUER avec votre émetteur, sans barre oblique finale, et DIDIT_APPLICATION_ID avec l’identifiant de votre application : les tokens le transportent dans aud. Votre clé publiable encode l’émetteur : après pk_live_ ou pk_test_, elle contient l’émetteur en base64url sans padding.
Lorsque votre domaine personnalisé devient actif, il remplace l’hôte par défaut comme émetteur. Les nouveaux tokens le mentionnent dans
iss, la découverte pointe jwks_uri vers lui, et votre clé publiable change. Les tokens d’accès émis sous l’hôte par défaut échouent alors sur GET /session/ jusqu’à leur rafraîchissement. Mettez à jour DIDIT_AUTH_ISSUER lorsque vous activez le domaine, ou acceptez les deux émetteurs jusqu’à l’expiration des tokens plus anciens, dans un délai de 5 minutes.Découverte et clés
L’émetteur prend en charge :
- Le type de réponse
codeet le mode de réponsequery. - Les types d’octroi
authorization_codeetrefresh_token. - La méthode PKCE
S256uniquement. Les clients sont publics : il n’existe pas de secret client, etclient_idcorrespond à l’identifiant de votre application. - L’algorithme de signature
ES256(clés P-256). - Les scopes
openid,email,phone,profileetoffline_access.
prompt=none n’est pas pris en charge. Utilisez GET /session/ pour lire et vérifier une session.
Cache et rotation
Les deux documents renvoientCache-Control: public, max-age=300, afin que vous et les caches partagés puissiez les conserver pendant 5 minutes. Ils autorisent 1 200 requêtes par minute et 12 000 par heure et par adresse IP, bien au-delà des endpoints de connexion, car de nombreuses instances backend partagent souvent une même adresse.
- Chaque clé possède un
kid; les nouveaux identifiants de clé commencent park_. Chaque token indique sa clé dans l’en-têtekid. - Les clés tournent tous les 30 jours. Didit publie la clé suivante un jour avant qu’elle ne commence à signer, et maintient la clé précédente publiée pendant un jour après qu’elle a cessé de signer. Un JWKS mis en cache pendant 5 minutes permet donc de continuer à vérifier les tokens pendant une rotation.
- Mettez les clés en cache par
kid. Lorsqu’un token mentionne unkidque vous ne possédez pas, récupérez à nouveau le JWKS, au maximum une fois par minute, et rejetez le token si la clé est toujours absente. - Lorsque Didit révoque une clé compromise, elle retire immédiatement la clé du JWKS, et
GET /session/rejette chaque token signé par cette clé. Une clé de remplacement commence à signer immédiatement, sans le jour de publication anticipée. Un JWKS mis en cache jusqu’à 5 minutes plus tôt accepte encore la clé révoquée et ne connaît pas encore le remplacement ; les nouveaux tokens peuvent donc échouer à la vérification hors ligne jusqu’au rafraîchissement du cache.
Démarrer la connexion
Ouvrez la page hébergée, qui correspond à l’authorization_endpoint :
Les guides de démarrage rapide construisent cette requête à votre place.
Échanger le code
Le callback reçoitcode et state. Vérifiez state, puis échangez le code dans les 60 secondes. Chaque code ne fonctionne qu’une fois. Le corps peut être au format JSON ou encodé en formulaire.
expires_in indique le nombre de secondes restantes avant l’expiration du token d’accès. Lorsque vous désactivez les sessions multiples, cet échange met fin aux autres sessions de la personne.
Revendications du jeton d’accès
Le jeton d’accès est un JWT dont l’en-tête estalg: ES256 et typ: at+jwt. Il est valable 5 minutes au maximum, et jamais plus longtemps que sa session.
Le jeton ID a l’en-tête
typ: JWT. Il contient les mêmes revendications, à l’exception de client_id, ainsi que auth_time et email_verified, et email, name et phone_number lorsqu’ils ont une valeur. Seul le jeton ID issu de l’échange du code contient nonce, lorsque la connexion en comportait un : vérifiez-le à cet endroit, car les jetons ID issus d’un rafraîchissement ne le contiennent jamais. Un jeton ID n’est jamais accepté comme jeton d’accès.
Vérifier un jeton sur votre serveur
Vérifiez tous les points suivants avant de faire confiance à une revendication :algvautES256ettypvautat+jwt. Rejetez tout autre algorithme, y comprisnone.- Le
kidfigure dans le JWKS de votre application et la signature est valide. issest égal à votre émetteur configuré, etaudest égal à l’ID de votre application.expetiatsont valides, avec une tolérance d’écart d’horloge de 60 secondes au maximum, etsub,sidetjtisont présents.actvautnull. Le jeton d’accès d’un agent IA est signé avec la même clé et porte les mêmestyp,issetaud; seulactpermet de le distinguer. Rejetez-le, sauf si l’endpoint accepte les agents : dans ce cas, n’autorisez que ce queact.scopesaccorde.GET /session/rejette toujours le jeton d’un agent.
GET /session/.
Vérifier la session
sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri et organizations. Chaque entrée d’organisation contient organization_id, organization__name, role et custom_role.
Cette vérification est plus stricte que la vérification hors ligne. Elle échoue aussi lorsque la session a été révoquée, est restée inactive ou a dépassé sa durée de vie, lorsque la personne a été bloquée ou que son e-mail n’est plus vérifié, lorsque la session ne respecte plus votre politique MFA (par exemple après l’ajout d’une application d’authentification par la personne ou sa nomination comme administrateur d’une organisation), ou lorsque le jeton a été remplacé par un rafraîchissement. Un échec renvoie 401 {"detail": "invalid_token"} avec WWW-Authenticate: Bearer.
GET /session/ autorise 30 requêtes par minute et 300 par heure et par adresse IP, une limite qu’il partage avec DELETE /session/. Vérifiez les jetons hors ligne à chaque requête, et réservez cet appel aux moments qui en ont besoin. Chaque appel réussi compte comme une activité : il réinitialise le idle_timeout de la session.
Un e-mail vérifié n’est pas une vérification d’identité. Lisez verified pour cela : ici, il vaut null lorsqu’il n’y en a pas, alors que les jetons contiennent {}.
Rafraîchir les jetons
- Le jeton de rafraîchissement est une chaîne aléatoire, valable jusqu’à la fin de la session.
- La réutilisation met fin à la session. Lorsqu’un jeton de rafraîchissement déjà utilisé est à nouveau reçu, Didit y voit le signe d’un vol : il révoque la session et renvoie
400 {"error": "invalid_grant"}. Les jetons de la session cessent aussi de fonctionner, y compris ceux du rafraîchissement précédent : leur jeton de rafraîchissement échoue, et leur jeton d’accès échoue immédiatement surGET /session/, bien qu’il reste valable hors ligne jusqu’à son expiration, dans un délai de 5 minutes. - Ne lancez qu’un seul rafraîchissement à la fois pour une session, entre onglets, appareils et instances de serveur, et remplacez les trois jetons ensemble.
- Si un rafraîchissement échoue avec
400ou n’obtient aucune réponse, relancez la connexion. Ne réessayez pas aveuglément : une nouvelle tentative après un rafraîchissement réussi constitue une réutilisation. - Un
503 {"error": "temporarily_unavailable"}signifie que le rafraîchissement n’a pas eu lieu et que votre jeton de rafraîchissement fonctionne toujours. Réessayez avec un délai progressif. - Didit répond par un
429avant l’exécution du rafraîchissement : réessayez aprèsRetry-After. L’endpoint de jetons autorise 30 requêtes par minute et 300 par heure et par adresse IP. En plus, chaquePOSTetDELETEde votre application partage des compartiments de protection contre les bots : 60 requêtes par minute et par adresse IP pour l’ensemble de ces endpoints, et 30 par minute et par appareil. Pour l’ensemble de l’application, les rafraîchissements disposent d’un compartiment de 6 000 par minute, et chaque autrePOSTetDELETE(navigateurs et étapes de connexion compris) d’un compartiment de 3 000 par minute, afin que les rafraîchissements n’épuisent jamais votre quota de connexions. - Avec des jetons d’accès de 5 minutes, 300 rafraîchissements par heure suffisent pour environ 25 personnes restant actives. Si votre serveur rafraîchit les jetons de nombreuses personnes depuis une même adresse, ne rafraîchissez que lorsqu’une requête a besoin d’un nouveau jeton, et rafraîchissez dans le navigateur ou l’application lorsque c’est possible.
Déconnexion
DELETE /session/ avec le token d’accès actuel de la personne met fin à la session et renvoie 204. Son token de renouvellement cesse de fonctionner, et ses tokens d’accès échouent immédiatement lors de l’appel à GET /session/. Les tokens que vous vérifiez hors ligne restent valides jusqu’à leur expiration. Redirigez ensuite la personne vers votre post_logout_redirect_uri, si vous en avez défini un.
La déconnexion nécessite un token d’accès accepté par GET /session/ : un token non expiré et qui n’a pas été remplacé lors d’un renouvellement. Un 401 signifie que la session n’a pas pris fin. Renouvelez le token, puis déconnectez-vous avec le nouveau token d’accès. Si le renouvellement échoue avec 400, la session ne peut plus être utilisée.
Une session prend également fin lorsque :
- elle dépasse
session_lifetime(30 jours par défaut) ouidle_timeout(1 jour par défaut), - la personne se reconnecte alors que les sessions multiples sont désactivées,
- la personne réinitialise son mot de passe alors que
revoke_on_password_changeest activé, - votre équipe la révoque ou bloque la personne dans la console,
- un token de renouvellement déjà utilisé est envoyé à nouveau.
Durées de vie
Stocker les identifiants selon leur usage
- Conservez les clés API de vérification et les tokens de la console sur votre serveur.
- Conservez les tokens d’accès du navigateur en mémoire lorsque c’est possible. Pour les applications rendues côté serveur, utilisez des cookies sécurisés HttpOnly et protégez les requêtes authentifiées par cookie contre les attaques CSRF.
- Stockez les tokens de renouvellement mobiles dans un stockage protégé par la plateforme. Effacez l’état local après la déconnexion.
- Ne placez jamais de tokens dans des URL ou dans des journaux.