Points de terminaison OAuth 2.0 et OpenID Connect

Statut : planned. Cette page décrit la surface du protocole de chaque environnement KeenAuth telle que spécifiée dans le plan (§13). Les points de terminaison sont en cours de développement pendant la phase 2 et ne sont pas encore disponibles dans un environnement hébergé. Les détails peuvent encore changer avant la disponibilité générale.

Chaque environnement est son propre serveur d'autorisation OAuth 2.0 et son propre fournisseur OpenID Connect. Les points de terminaison ne font pas partie de l'API de gestion : ils se trouvent sur l'hôte de l'environnement, https://<environment-slug>.<region>.keenauth.app, ou sur votre domaine personnalisé vérifié. Dans le tableau, <issuer> désigne l'émetteur de l'environnement, c'est-à-dire la valeur de issuer dans le document de découverte.

Points de terminaison

Point de terminaison Méthode et chemin Authentification du client
Découverte GET <issuer>/.well-known/openid-configuration et GET <issuer>/.well-known/oauth-authorization-server (RFC 8414, contenu identique) Aucune
Clés GET <issuer>/.well-known/jwks.json Aucune
Autorisation GET ou POST <login host>/oauth2/authorize Aucune (navigateur)
Requête d'autorisation poussée (RFC 9126) POST <issuer>/oauth2/par Requise pour les clients confidentiels ; client_id pour les clients publics
Jeton POST <issuer>/oauth2/token Requise pour les clients confidentiels ; client_id pour les clients publics (DPoP est facultatif)
Autorisation d'appareil (RFC 8628) POST <issuer>/oauth2/device_authorization Identique au point de terminaison de jeton
Révocation (RFC 7009) POST <issuer>/oauth2/revoke Identique au point de terminaison de jeton
Introspection (RFC 7662) POST <issuer>/oauth2/introspect Client confidentiel uniquement
UserInfo GET ou POST <issuer>/oauth2/userinfo Jeton d'accès Bearer ou DPoP
Fin de session GET ou POST <login host>/oauth2/logout Aucune (id_token_hint ou client_id)

<login host> désigne n'importe quel domaine de connexion de l'environnement : l'hôte par défaut ou un domaine personnalisé ajouté. Le document de découverte n'est servi que sur l'hôte de l'émetteur. Sur un autre hôte de connexion, /.well-known/openid-configuration renvoie 404 avec l'URL de l'émetteur dans le corps de la réponse.

Types d'autorisation

Type Utilisation
authorization_code Connexion depuis un navigateur et des applications natives. PKCE avec S256 est requis.
refresh_token Renouvelle les jetons. Chaque utilisation fait tourner le jeton de rafraîchissement, et la réutilisation d'un ancien jeton révoque toute la famille de jetons.
client_credentials Accès de machine à machine.
urn:ietf:params:oauth:grant-type:device_code Appareils sans clavier, comme une télévision ou un outil en ligne de commande.
urn:ietf:params:oauth:grant-type:token-exchange Délégation et usurpation d'identité entre services.

Les flux implicites (response_type=token et tout ce qui contient id_token), le type d'autorisation par identifiants du propriétaire des ressources (resource owner password credentials) et les types de réponse hybrides ne sont pas pris en charge, ni maintenant ni plus tard. La RFC 9700 interdit les deux premiers.

Autorisation d'appareil

Un appareil sans navigateur démarre le flux avec POST <issuer>/oauth2/device_authorization. Seules les applications de type device ou native qui listent explicitement le type d'autorisation par appareil peuvent l'utiliser. La réponse contient un device_code, un user_code et une adresse de vérification. L'utilisateur ouvre cette adresse sur un autre appareil, se connecte et approuve. Pendant ce temps, l'appareil interroge le point de terminaison de jeton avec grant_type=urn:ietf:params:oauth:grant-type:device_code. Le user_code comporte 8 caractères et s'affiche sous la forme XXXX-XXXX. Un code d'appareil est valide pendant 10 minutes et ne fonctionne qu'une fois. L'appareil interroge au maximum toutes les 5 secondes ; une interrogation plus rapide reçoit la réponse slow_down, qui ajoute 5 secondes à l'intervalle. Le verification_uri est https://<login host>/u/device, et l'utilisateur voit l'application, les étendues demandées et le pays de l'appareil ayant lancé la demande avant d'approuver.

Règles de sécurité

L'environnement respecte sans exception les meilleures pratiques actuelles de sécurité d'OAuth 2.0 (RFC 9700) :

Sessions et déconnexion

Après une connexion réussie, l'environnement conserve une session d'authentification unique dans un cookie HttpOnly sur l'hôte de connexion. Les applications du même environnement la réutilisent, de sorte qu'une deuxième application ne demande pas de nouveau mot de passe, sauf si sa politique exige une authentification plus forte ou plus récente. Votre code ne voit jamais le cookie : il ne voit que la réponse d'autorisation.

Le point de terminaison de fin de session (OpenID Connect RP-Initiated Logout 1.0) met fin à cette session, révoque les jetons de rafraîchissement qui lui appartiennent et notifie les applications ayant enregistré une adresse de déconnexion back-channel. Pour lister ou révoquer les sessions d'un utilisateur depuis votre backend, utilisez les points de terminaison de session de l'API de gestion.

Si l'utilisateur s'est connecté via une connexion d'entreprise, ajoutez federated=true à la requête de fin de session pour le déconnecter également chez son fournisseur d'identité. La session est d'abord terminée ici ; le navigateur se rend ensuite à la déconnexion du fournisseur d'identité (déconnexion unique SAML, ou point de terminaison de fin de session du fournisseur OpenID) et revient vers le post_logout_redirect_uri. Cela n'a lieu que si la connexion a la déconnexion au fournisseur d'identité activée et si le fournisseur publie une adresse de déconnexion. Sinon, ou si le fournisseur est injoignable, la requête fonctionne comme sans ce paramètre. La déconnexion chez le fournisseur d'identité peut aussi mettre fin aux autres applications de l'utilisateur qui l'utilisent.