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.
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:
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:
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.
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.