web-dev-qa-db-fra.com

Précision sur id_token vs access_token

Je construis un système avec OIDC et OAuth 2.0 (avec Auth0), et je ne sais pas comment utiliser correctement les id_token et access_token. Ou plutôt, je ne comprends pas quels rôles attribuer aux différents services de ma configuration.

J'ai une application frontale entièrement statique (application d'une seule page, HTML + JS, pas de backend) qui garantit l'authentification de l'utilisateur à l'aide du flux implicite contre Auth0. L'application frontend extrait ensuite les données d'une API que je suis également en train de construire.

Maintenant, qui a raison?

  • Le SPA frontal est l'application OAuth client
  • Mon service API est un serveur OAuth resource

...ou:

  • L'interface client et mon service d'API sont à la fois l'application client

Si mes API frontale et backend peuvent être considérées comme le client, je ne vois pas vraiment de danger à utiliser le id_token en tant que jeton porteur sur les demandes de mon interface à mon backend - c'est attrayant car je peux simplement vérifier le jeton signé le backend, et j'ai toutes les informations sur l'utilisateur dont j'ai besoin. Cependant, si mon API est considérée comme un serveur resource, je devrais probablement utiliser le access_token, mais je dois ensuite me connecter aux serveurs d'Auth0 à chaque demande d'API pour vérifier le jeton et obtenir des informations utilisateur de base. JE?

J'ai lu this qui semble suggérer que le access_token est le seul jeton valide à utiliser avec mon API. Mais comme je l'ai dit, je ne suis pas sûr du rôle des différents services. Et utiliser le id_token est tentant, car il ne nécessite aucune connexion réseau sur le serveur, et contient des informations dont j'ai besoin pour extraire les bonnes données.

Quelle est la bonne façon de s'y prendre?

15
Christian Johansen

Votre frontent est votre application cliente OAuth, une fois qu'il a stocké le jeton et peut effectuer des actions sur le flux OAuth. Et votre service d'API est un service de ressources, car il accepte le code d'accès_test délivré par votre serveur d'identité.

De plus, je dirais que votre id_token représente l'identification de l'utilisateur connecté et peut contenir des données sensibles pour votre application. Access_token est votre identifiant pour accéder à une ressource.

À la fin, vous utiliserez access_token pour demander une ressource, et si vous avez besoin de données spécifiques de l'utilisateur connecté (propriétaire de la ressource), vous pouvez demander le jeton ID au noeud final du jeton.

1
Arley Pádua

À mon avis, la première approche est correcte. Votre SPA est l’application client et vos API sont des serveurs de ressources. 

Je vous suggérerais de limiter l'utilisation d'id_token jusqu'à votre SPA uniquement. Vous pouvez utiliser les informations de base présentes dans le jeton d'identification (telles que le nom d'utilisateur et l'adresse électronique) pour afficher les informations sur l'utilisateur dans votre interface utilisateur. Si vous pouvez également générer des jetons d'accès en tant que JWT, votre API peut valider les jetons d'accès sans passer par le fournisseur d'identité. Vous pouvez inclure des rôles (ou similaires) dans votre jeton d'accès pour obtenir des informations d'autorisation dans votre jeton d'accès.

1
Sumit