web-dev-qa-db-fra.com

OAuth 2 vs OpenID Connect pour sécuriser l'API

Je suis en train de développer une API Web qui supportera plusieurs applications: un site web, une ou plusieurs applications mobiles compagnons et éventuellement plusieurs applications tierces. On s'attend à ce que chaque application obtienne un jeton d'accès du serveur d'authentification, puis le transmet à l'API, l'utilisateur saisira ses informations d'identification soit sur l'interface Web du serveur d'authentification (pour les applications tierces), soit directement sur le site Web ou l'application (pour les utilisateurs "de confiance"). applications). On ne s'attend pas à ce que les applications clientes elles-mêmes nécessitent une identité d'utilisateur.

J'ai commencé à l'implémenter via OAuth 2, et cela correspond exactement à mes cas d'utilisation. Mais plus tard, j'ai trouvé plusieurs discussions dans le 'net qui m'ont envoyé penser si mon scénario nécessite vraiment OpenID Connect, et maintenant, après quelques milliers de mots lus, je ne peux toujours pas grok lequel est le mieux pour mon cas.

(Par exemple, GitHub, qui correspond à peu près à mes cas d'utilisation, tilise OAuth 2)

J'aimerais entendre quelques directives sur la façon de choisir si son API nécessite OAuth 2 ou OpenID Connect.

Mise à jour

Ce qui m'embrouille est le suivant: il n'y a aucun intérêt à ne pas utiliser OAuth pour authentification. Mais considérons ce cas (supposons qu'il existe une règle métier simple: chaque utilisateur ne peut voir que ses propres documents):

  • l'application va au serveur d'authentification pour le jeton
  • l'utilisateur autorise l'application, le jeton est donc accordé
  • l'application va à l'api avec le jeton pour les données
  • api renvoie des documents pour l'utilisateur qui a autorisé le jeton (donc, en quelque sorte, le jeton peut être retracé jusqu'à l'utilisateur)

S'agit-il d'un scénario d'authentification ou d'un scénario d'autorisation?

PS. Je connais cette question , mais la meilleure réponse là-bas ne répond pas à mes doutes.

37
Serg Rogovtsev

D'après ce que vous avez expliqué, il semble que OAuth 2.0 conviendrait mieux à vos besoins. OpenID Connect a été développé pour ajouter une authentification sécurisée à OAuth 2.0. Grands fournisseurs, par exemple Google , Facebook, Yahoo, etc. ont commencé à utiliser OAuth 2.0 pour authentifier les utilisateurs avec des services de "connexion avec" afin que les utilisateurs puissent utiliser leurs informations d'identification pour s'authentifier auprès de divers services tiers. Standard = OAuth 2.0 ne peut pas satisfaire de manière sécurisée à cette exigence en raison de déficiences du protocole. OpenID Connect résout ces déficiences et permet aux fournisseurs d'utiliser en toute sécurité OAuth 2.0 comme cadre d'authentification. = OAuth 2.0 a été initialement développé comme un cadre d'autorisation qui permet à un utilisateur d'accorder à un service tiers l'accès à ses données stockées sur le fournisseur. Le scénario que vous avez décrit ressemble exactement à ce qui est OAuth 2.0 a été développé pour le faire. Si vous ne prévoyez pas d'offrir un mécanisme de "connexion avec", utilisez OAuth 2.0.

Si un utilisateur possède ses propres informations d'identification pour les services tiers et n'utilise pas les informations d'identification de vos fournisseurs pour se connecter au service, vous n'aurez pas besoin d'OpenID Connect.

This était la ressource la plus utile que j'ai trouvée. Il s'agit d'un article de blog par l'un des concepteurs d'OpenID Connect qui aborde les différentes utilisations de Facebook pour OAuth 2.0.

21
Justin Moore

Tout d'abord, comme vous le savez probablement, OpenID Connect n'est qu'une couche d'authentification construite au-dessus d'OAuth2. Donc, quel que soit celui que vous choisissez, vous devrez implémenter OAuth2 (comme dénominateur commun).

OAuth2 lui-même est un mécanisme d'autorisation (c'est-à-dire qu'il vous permet de vérifier qu'un jeton est valide et qu'un ensemble spécifique de portées est accordé). Il ne fournit pas d'authentification prête à l'emploi (vous ne pouvez pas immédiatement dire "qui" est l'utilisateur).

Cependant, dans de nombreux cas, vous cherchez à avoir à la fois une autorisation et une authentification. Dans ce cas, vous avez besoin d'une couche au-dessus d'OAuth2 pour fournir cela. Pour ce faire, le serveur de ressources expose une sorte de "Qui suis-je?" point de terminaison qui renvoie l'identité de l'utilisateur associé au jeton d'accès.

OpenID Connect fait cela et fournit un moyen standard d'obtenir et de représenter l'identité de l'utilisateur (c'est l'objet renvoyé par le point de terminaison serInfo ) sous la forme d'un ensemble de revendications .

Il permet également à l'application cliente de recevoir les informations utilisateur ainsi que le jeton d'accès (c'est le id_token renvoyé par le point de terminaison du jeton ou inclus à côté du code d'autorisation en tant que jeton JWT signé, en fonction de votre flux), qui enregistre une requête HTTP.

OpenID Connect fournit également un tas d'autres choses que l'OMI présente un moindre intérêt (enregistrement dynamique, etc.).

Donc, pour répondre à votre question sur OAuth2 par rapport à OpenID Connect: si vous avez besoin d'une authentification pour vos API, vous devrez l'implémenter par-dessus OAuth2. Vous pouvez faire quelque chose de personnalisé ou vous pouvez implémenter OpenID Connect. OpenID Connect est très complexe si vous voulez implémenter la spécification entière, mais relativement facile si vous voulez simplement implémenter le MVP pour authentifier un utilisateur (implémenter le et utilisez la représentation standard, et émettez peut-être id_tokens).

Pour plus d'informations, consultez la spécification OpenID Connect .

11
Christophe L