web-dev-qa-db-fra.com

Comment fonctionne le système à deux pattes oauth dans OAuth 2.0?

Dans OAuth 1.0, 2-legged est assez facile: envoyez simplement la demande comme d'habitude et omettez le access_token entête.

Les choses semblent avoir changé en OAuth 2.0 (radicalement, comme je l'ai découvert aujourd'hui :)). Dans OAuth 2.0, la demande n'a plus d'en-têtes tels que le nonce, la clé du consommateur, l'horodatage, etc. Ceci est simplement remplacé par:

Authorization: OAuth ya29.4fgasdfafasdfdsaf3waffghfhfgh

Je comprends le fonctionnement des autorisations à 3 jambes dans OAuth 2.0 et les flux d'application. Mais comment fonctionne à 2 jambes dans 2.0? Est-il possible de concevoir une API qui peut prendre en charge à la fois 2 et 3 jambes -legged OAuth 2.0?

Je cherchais des informations à ce sujet, mais j'ai trouvé beaucoup de choses sur 2 pattes pour 1.0 et presque rien pour 2.0.

51
F21

Après de nombreuses recherches, j'ai découvert que client_credentials le type de subvention correspond à ce scénario. Une fois que vous avez inséré ce terme dans google, vous pouvez trouver de nombreuses ressources très utiles.

Il s'agit du flux normal pour les éléments à trois pattes OAuth 2.0 (nous voulons que l'utilisateur se connecte):

Supposons que nous ayons les points de terminaison suivants dans notre application pour l'authentification:

/oauth/auth

/oauth/token

Normalement (pour l'octroi du code d'autorisation), nous dirigeons l'utilisateur vers /oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah

Ensuite, lors de l'authentification, l'utilisateur est redirigé vers mysite.com/blah?code=somecode

Nous obtenons ensuite somecode et l'échangeons contre un jeton en utilisant /oauth/token?code=somecode&client_id=myid&client_secret=mysecret

Nous pouvons ensuite utiliser le jeton pour effectuer des appels.


Il s'agit du flux d'application pour client_credentials pour implémenter 2 éléments OAuth 2.0, ce qui est nettement plus simple:

  • Dans cette approche, nous n'avons pas besoin d'effectuer d'authentification.
  • Nous avons simplement POST to /oauth/token avec les données de formulaire suivantes:

    grant_type=client_credentials&scope=view_friends
    

Notez que la portée est facultative. Le point de terminaison renvoie ensuite directement un jeton d'accès que nous pouvons utiliser (aucun jeton d'actualisation n'est fourni). Étant donné qu'aucun jeton d'actualisation n'est fourni, à l'expiration du jeton, vous devrez vous authentifier à nouveau et en demander un nouveau.

Cela conduit aux mises en garde suivantes:

  • Utilisez-le uniquement pour les applications de confiance (très très) telles que les applications internes.
  • Vous devez utiliser votre propre moyen d'authentification. Par exemple, le exemple de RFC utilise l'authentification de base.

Une autre solution consiste à utiliser des JWT (jetons Web JSON) comme google OAuth API . C'est un processus très compliqué, mais il existe de nombreuses bibliothèques pour générer votre JWT. Vous postez ensuite les données de formulaire suivantes (URL encodée bien sûr):

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=generated_jwt

Ceci est publié sur /oauth/token pour obtenir votre jeton.


Quant à la question de si vous pouvez créer une API qui prend en charge les deux et trois pattes OAuth 2.0 , Oui, c'est possible .

Ensuite /auth endpoint n'est utilisé que lorsque les utilisateurs doivent s'authentifier auprès du service.

Dans le /token endpoint, vérifiez simplement la valeur de grant_type dans les paramètres GET pour urn:ietf:params:oauth:grant-type:jwt-bearer si vous utilisez JWT ou client_credentials pour les informations d'identification du client.

Notez que lors de la génération de client_id et client_secret à donner à l'utilisateur, si vous prenez en charge plusieurs grant_types, assurez-vous que vous disposez d'une colonne de base de données pour stocker le type de type d'autorisation pour lequel l'ID et le secret ont été générés. S'il est nécessaire d'avoir plusieurs types de droits par utilisateur, générez un ensemble différent d'informations d'identification pour chaque type de droit.

67
F21

Vous pouvez également consulter la mise en œuvre de Google de OAuth2 à 2 pattes (je crois que cette documentation n'a été publiée que récemment).

Les documents de délégation du SDK Google Drive devraient également aider à comprendre l'implémentation OAuth2 à deux pattes de Google.

2
Miguel Andres