À quoi sert le type d'autorisation implicite de subvention dans L'article 2?

Je ne sais pas si j'ai juste une sorte d'angle mort ou quoi, mais j'ai lu la spécification OAuth 2 plusieurs fois et j'ai parcouru les archives de la liste de diffusion, et je n'ai pas encore trouvé une bonne explication de la raison pour laquelle le flux implicite de subvention pour obtenir des jetons d'accès a été développé. Comparé au Code D'autorisation Grant, il semble simplement renoncer à l'authentification du client pour aucune raison très convaincante. Comment est-ce "optimisé pour les clients mis en œuvre dans un navigateur en utilisant un langage de script" (à citer la spécification)?

les deux flux commencent de la même manière (source: http://tools.ietf.org/html/draft-ietf-oauth-v2-22 ):

  1. le client amorce le processus en dirigeant l'agent-utilisateur du propriétaire de la ressource vers le point final de l'autorisation.
  2. le serveur d'autorisation authentifie le propriétaire de la ressource (par l'intermédiaire de l'agent-utilisateur) et établit si le propriétaire de la ressource accorde ou refuse au client demande d'accès.
  3. en supposant que le propriétaire de la ressource accorde l'accès, le serveur d'autorisation redirige l'agent-utilisateur vers le client en utilisant l'URI de redirection fourni précédemment (dans la demande ou lors de l'enregistrement du client).
    • L'URI de redirection comprend un code d'autorisation (flux de code D'autorisation)
    • L'URI de redirection inclut le jeton d'accès dans le fragment D'URI (flux implicite)

C'est ici que les flux se divisent. Dans les deux cas, L'URI de redirection à ce point est à un point final hébergé par le client:

  • dans le flux de code D'autorisation, lorsque l'agent utilisateur atteint ce point final avec le code D'autorisation dans L'URI, le code à ce point final échange le code d'autorisation avec les justificatifs d'identité de ses clients pour un jeton d'accès qu'il peut ensuite utiliser selon les besoins. Il pourrait, par exemple, écrire dans une page web qu'un script sur la page pourrait accéder.
  • le flux implicite saute complètement cette étape d'authentification du client et charge simplement une page Web avec le script client. Il y a un truc mignon ici avec le fragment D'URL qui empêche le token d'accès de passer trop, mais le résultat final est essentiellement le même: le site hébergé par le client sert une page avec un script qui peut saisir le token d'accès.

D'où ma question: ce qui a été acquis ici, en sautant l'étape d'authentification du client?

218
demandé sur John Bachir 2011-09-23 03:52:53

11 réponses

Voici mes pensées:

le but de auth code + token dans le flux de code d'autorisation est que token et client secret ne seront jamais exposés au propriétaire de la ressource parce qu'ils voyagent de serveur en serveur.

de l'autre côté, le flux implicite de subvention est pour les clients qui sont mis en œuvre entièrement en utilisant javascript et sont en cours d'exécution dans le navigateur du propriétaire de la ressource. Vous n'avez pas besoin de code côté serveur pour utiliser ce flux. Ensuite, si tout se passe dans navigateur du propriétaire de la ressource il n'a plus aucun sens de publier le code d'auteur et le secret client, car token & client secret sera toujours partagé avec le propriétaire de la ressource. L'inclusion du code d'auth et du secret client ne fait que rendre le flux plus complexe sans ajouter de sécurité réelle.

donc la réponse sur " qu'est-ce qui a été gagné?"est "simplicité".

171
répondu Philip Peshin 2018-06-11 06:20:12

C'est là pour des raisons de sécurité, pas pour des raisons de simplicité.

vous devez tenir compte de la différence entre le agent utilisateur et le client :

l'agent-utilisateur est le logiciel par lequel l'utilisateur ("propriétaire de la ressource") communique avec d'autres parties du système (serveur d'authentification et serveur de ressources).

Le client est le logiciel qui veut accéder aux ressources de l'utilisateur sur le serveur de ressources.

dans le cas d'un utilisateur-agent découplé et d'un client, le code D'autorisation a du sens. Par exemple: l'utilisateur utilise un navigateur web (user-agent) pour se connecter avec son compte Facebook sur Kickstarter. Dans ce cas, le client est l'un des serveurs de Kickstarter, qui gère les logins de l'utilisateur. Ce serveur reçoit le token d'accès et le token de rafraîchissement de Facebook. Ainsi ce type de client a considéré être "sécurisé", en raison de l'accès restreint, les jetons peuvent être enregistrés et Kickstarter peut accéder aux ressources des utilisateurs et même rafraîchir les jetons d'accès sans interaction avec l'utilisateur.

si l'agent-utilisateur et le client sont couplés (par exemple application mobile native, application javascript), le flux de travail D'autorisation implicite peut être appliqué. Il dépend de la présence du propriétaire de la ressource (pour entrer les informations d'identification) et ne supporte pas les tokens de rafraîchissement. Si ce client stocke le token d'accès pour une utilisation ultérieure, ce sera un problème de sécurité, car le token peut être facilement extrait par d'autres applications ou utilisateurs du client. L'absence de l'actualisation jeton est un indice supplémentaire, que cette méthode n'est pas conçu pour l'accès à l'utilisateur des ressources en l'absence de l'utilisateur.

79
répondu artkoenig 2016-11-22 21:42:12

l'explication habituelle est que la subvention implicite est plus facile à mettre en œuvre lorsque vous utilisez un client JavaScript. Mais je pense que c'est la mauvaise façon de le regarder. Si vous utilisez un client JavaScript qui demande des ressources protégées directement via XMLHttpRequest, la subvention implicite est votre seule option, bien qu'elle soit moins sécurisée.

le code D'autorisation grant fournit une sécurité supplémentaire, mais il ne fonctionne que lorsque vous avez un serveur web demandant la protection ressources. Puisque le serveur web peut stocker le token d'accès, vous courez moins de risque que le token d'accès soit exposé à Internet, et vous pouvez émettre un token qui dure longtemps. Et puisque le serveur web est fiable, il peut recevoir un "jeton de rafraîchissement", de sorte qu'il peut obtenir un nouveau jeton d'accès lorsque l'ancien jeton expire.

mais -- et c'est un point facile à manquer -- la sécurité du flux de code D'autorisation ne fonctionne que si le serveur web est protégé par une session, qui est établi avec l'authentification de l'utilisateur (login). Sans session, un utilisateur non fiable pourrait simplement faire des requêtes au serveur web, en utilisant le client_id, et ce serait la même chose que si l'utilisateur avait le token d'accès. L'ajout d'une séance signifie que seul un utilisateur authentifié peut accéder aux ressources protégées. Le client_id est juste l '"identité" de la webapp JS, pas l'authentification de ladite webapp.

cela signifie également que vous pouvez terminer la session avant l'expiration du jeton OAuth. Il n'y a aucun moyen standard d'invalider un token d'accès. Mais si votre session expire, le jeton d'accès est inutile, puisque personne ne le sait à part le serveur web. Si un utilisateur non fiable accède à votre clé de session, il ne pourra accéder aux ressources protégées que tant que la session sera valide.

S'il n'y a pas de serveur web, vous devez utiliser la subvention implicite. Mais cela signifie que le jeton d'accès est exposé à Internet. Si un utilisateur non fiable accède à c', ils peuvent l'utiliser jusqu'à ce qu'il expire. Cela signifie qu'ils y auront accès plus longtemps qu'avec un Code D'autorisation. Vous pouvez donc envisager de faire expirer le jeton plus tôt, et éviter de donner accès à des ressources plus sensibles.

53
répondu JW. 2017-04-15 03:44:04

il se résume à: si un utilisateur exécute un navigateur basé, ou" public", (JavaScript) application web sans composant côté serveur, alors l'utilisateur implicitement fait confiance l'application (et le navigateur où il s'exécute, potentiellement avec d'autres applications basées sur le navigateur...).

il n'y a pas de serveur distant tiers, seulement le serveur de ressources. Il n'y a aucun avantage à un code d'autorisation, parce qu'il n'y a pas autre agent en dehors du navigateur agissant pour le compte de l'utilisateur. Il n'y a pas d'avantage aux justificatifs d'identité des clients pour la même raison. ( Tout client peut tenter d'utiliser ce flux.)

Les implications de sécurité, cependant, sont importants. De http://tools.ietf.org/html/rfc6749#section-10.3 :

Lorsqu'on utilise le type de subvention implicite, le jeton d'accès est transmis en le fragment D'URI, qui peut l'exposer à des partie.

de http://tools.ietf.org/html/rfc6749#section-10.16 :

Une ressource propriétaire peut volontiers déléguer l'accès à une ressource par accorder un jeton d'accès au client malveillant de l'attaquant. Cela peut c'est dû à l'hameçonnage ou à un autre prétexte...

21
répondu Will 2013-04-24 14:47:01

Je ne suis pas sûr de comprendre correctement la réponse et le commentaire de Dan. Il me semble que la réponse a énoncé certains faits corrects, mais elle indique exactement ce que L'OP a demandé. Si je comprends bien, le principal avantage du flux implicite de subventions est qu'un client comme js app (E. G Chrome extension) ne doit pas exposer le secret du client.

Dan Taflin a dit:

... dans le flux de code d'autorisation le propriétaire de la ressource jamais besoin de voir le jeton d'accès, alors que dans les clients javascript c'est inévitable. Client secret pourrait toujours être tenu à l'écart des clients javascript en utilisant le flux de code d'autorisation, cependant..

peut-être que je vous ai mal compris, mais le client (js app dans ce cas) doit passer le justificatif du client (clé client et secret) au serveur de ressources dans le flux de code d'autorisation, non ? Le secret client ne peut pas être"caché à JS".

12
répondu tzuchien.chiu 2012-09-17 13:20:49

alors que subvention implicite a été conçu pour soutenir les applications qui ne pouvaient pas protéger un client secret, y compris les applications JavaScript côté client, les meilleures pratiques actuelles est d'utiliser le Code D'autorisation sans un Client Secret. Le OAuth 2.0 IETF RFC-6749 a été publié en 2012 et les recommandations actuelles sont de 2017.

2017 discussion sur l'IETF OAuth liste de diffusion est disponible à partir de ces maîtres d'œuvre:

pour en savoir plus:

implicite était précédemment recommandé pour les clients sans secret, mais a été remplacé par l'utilisation du code d'autorisation grant sans secret.

...

auparavant, il était il est recommandé que les applications basées sur le navigateur utilisent le flux "implicite", qui renvoie un jeton d'accès immédiatement et n'a pas d'étape d'échange de jeton. Depuis que la spécification a été rédigée, la pratique exemplaire de l'industrie a changé pour recommander que le flux de code d'autorisation soit utilisé sans le secret du client. Cela fournit plus d'occasions de créer un flux sécurisé, comme l'utilisation du paramètre state. Références: Redhat , Deutsche Telekom , Smart de Santé .

Passer au Code D'auteur sans Client Secret de subvention implicite est également mentionné pour les applications mobiles ici:

4
répondu Grokify 2018-09-17 21:39:51

en plus des autres réponses, il est également important de réaliser que le profil implicite permet un flux front-canal seulement par opposition au flux de Code D'autorisation qui nécessite un rappel vers le serveur D'autorisation; ceci devient évident dans OpenID Connect qui est un protocole SSO construit sur Auth 2.0 où le flux implicite ressemble à la très populaire liaison de poste SAML et le flux de Code D'autorisation ressemble à la liaison artéfact SAML moins largement déployée

3
répondu Hans Z. 2014-11-18 19:38:57

dans le flux implicite si le navigateur de l'utilisateur est corrompu (extension du mal / virus ) alors la corruption obtient l'accès aux ressources de l'utilisateur et peut faire les mauvaises choses.

dans le flux d'auth la corruption ne peut pas parce qu'il ne connaît pas le secret du client.

3
répondu Pace 2017-04-13 21:20:25

je pense que Will Cain a répondu à cela quand il a dit " il n'y a aucun avantage à la vérification des références des clients pour la même raison. (Tout client peut tenter d'utiliser ce flux.) "Considérez aussi que la redirect_uri pour le flux implicite peut-être "localhost"--aucun rappel n'est fait à partir du serveur D'autorisation pour le flux implicite. Comme il n'existe aucun moyen de pré-confiance le client, l'utilisateur devra approuver la publication des demandes des utilisateurs.

1
répondu Mike Schwartz 2014-12-17 18:33:13

https://tools.ietf.org/html/rfc6749#page-8

implicite

la subvention implicite est un flux de code d'autorisation simplifié optimisé pour les clients mis en œuvre dans un navigateur en utilisant un script langage tel que JavaScript. Dans le flux implicite, au lieu de la délivrance au client un code d'autorisation, le client est délivré un jeton d'accès directement (comme le résultat de la ressource propriétaire autorisation.) Le type de subvention est implicite, car aucun intermédiaire des lettres de créance (comme un code d'autorisation) sont émises (et postérieures utilisé pour obtenir un jeton d'accès).

lors de l'émission d'un jeton d'accès pendant le flux implicite de délivrance, le

le serveur d'autorisation n'authentifie pas le client. Dans certains

cas, l'identité du client peut être vérifiée via la redirection URI

utilisé pour délivrer le jeton d'accès au client. Le jeton d'accès peut être exposé au propriétaire de la ressource ou à d'autres applications avec accès à l'agent-utilisateur du propriétaire de la ressource.

les subventions implicites améliorent la réactivité et l'efficacité de certains

clients (tels qu'un client mis en œuvre comme une application dans le navigateur),

puisqu'il réduit le nombre de voyages aller-retour nécessaires pour obtenir un

accès jeton.

1
répondu Rzv Razvan 2017-10-14 08:23:36

la concession implicite permet d'obtenir des jetons de " Endpoint D'autorisation avec un GET . Cela signifie que le serveur d'autorisation n'a pas à supporter CORS.

si ce n'est pas un problème et qu'il n'y a pas d'autres problèmes liés au serveur d'autorisation étant inflexible (par exemple les tokens de rafraîchissement ne sont pas optionnels, pour une raison quelconque), alors le flux de code d'autorisation est préférable, même pour les clients publics, selon tendances récentes de l'industrie et au moins cette (actuelle) instance d'un projet officiel .

historiquement, il y avait d'autres raisons pour mettre en œuvre le flux implicite, mais il semble qu'elles soient actuellement compensées par les avantages de sécurité que le code d'autorisation accorde, y compris:

  • option de livraison et d'utilisation des tokens sur un back-channel pour les clients confidentiels
  • pas exposer les jetons dans l'historique du navigateur pour les clients publics
  • interruption d'un flux non autorisé avant l'émission de jetons - avec PKCE , pour "toutes sortes de clients non autorisés"
0
répondu ko la 2018-10-04 01:36:30