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 reprises et parcouru les archives de la liste de diffusion, et je n'ai pas encore trouvé une bonne explication de la raison pour laquelle la subvention implicite un flux permettant d'obtenir des jetons d'accès a été développé. Comparé à l'autorisation de code d'autorisation, il semble abandonner l'authentification du client sans raison très convaincante. Comment est-ce "optimisé pour les clients implémentés dans un navigateur utilisant un langage de script" (pour citer la spécification)?
Les deux flux démarrent de la même manière (source: http://tools.ietf.org/html/draft-ietf-oauth-v2-22 ):
- Le client lance le flux en dirigeant l'agent utilisateur du propriétaire de la ressource vers le point de terminaison d'autorisation.
- Le serveur d'autorisation authentifie le propriétaire de la ressource (via l'agent utilisateur) et établit si le propriétaire de la ressource accorde ou refuse la demande d'accès du client.
- En supposant que le propriétaire de la ressource accorde l'accès, le serveur d'autorisation redirige l'agent utilisateur vers le client à l'aide de l'URI de redirection fourni précédemment (dans la demande ou lors de l'inscription du client).
- L'URI de redirection inclut un code d'autorisation (Flux de code d'autorisation)
- L'URI de redirection inclut le jeton d'accès dans le fragment URI (flux implicite)
Voici où les flux se divisent. Dans les deux cas, l'URI de redirection à ce stade est vers un point de terminaison hébergé par le client:
- Dans le flux de code d'autorisation, lorsque l'agent utilisateur atteint ce point de terminaison avec le code d'autorisation dans l'URI, le code à ce point de terminaison échange le code d'autorisation avec ses informations d'identification client pour un jeton d'accès qu'il peut ensuite utiliser selon les besoins. Il pourrait, par exemple, l'écrire dans une page Web à laquelle un script de la page pourrait accéder.
- Le flux implicite ignore complètement cette étape d'authentification client et charge simplement une page Web avec le script client. Il y a une astuce mignonne ici avec le fragment d'URL qui empêche le jeton d'accès de trop circuler, 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 récupérer le jeton d'accès .
D'où ma question: qu'est-ce qui a été gagné ici en sautant l'étape d'authentification du client?
la source
Réponses:
Voici mes pensées:
Le but du code d'authentification + jeton dans le flux de code d'autorisation est que le jeton et le secret client ne seront jamais exposés au propriétaire de la ressource car ils voyagent de serveur à serveur.
De l'autre côté, le flux d'octroi implicite est destiné aux clients qui sont entièrement implémentés à l'aide de javascript et s'exécutent 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 le navigateur du propriétaire de la ressource, il n'est plus logique d'émettre le code d'authentification et le secret client, car le jeton et le secret client seront toujours partagés avec le propriétaire de la ressource. L'inclusion de code d'authentification et de secret client rend simplement le flux plus complexe sans ajouter plus de sécurité réelle.
Donc, la réponse sur "ce qui a été gagné?" c'est la "simplicité".
la source
Auth code
, ainsi queclient_id
etclient_secret
sont utilisés pour identifier les clients de confiance qui peuvent actualiser les jetons pour une connexion à long terme et pour une "connexion hors ligne" . Cependant, dans une application côté client, il n'y a aucun moyen d'enregistrer chaque client, d'où le type de subvention implicite "simplifié" pour un accès temporaire aux informations utilisateurIl est là pour des raisons de sécurité, pas pour des raisons de simplicité.
Vous devez considérer la différence entre l' agent utilisateur et le client :
L'agent utilisateur est le logiciel par lequel l'utilisateur ("propriétaire des ressources") communique avec d'autres parties du système (serveur d'authentification et serveur de ressources).
Le client est le logiciel qui souhaite accéder aux ressources de l'utilisateur sur le serveur de ressources.
Dans le cas d'un agent utilisateur et d'un client découplés, la subvention de code d'autorisation est logique. 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 du Kickstarter, qui gère les connexions utilisateur. Ce serveur obtient le jeton d'accès et le jeton d'actualisation de Facebook. Ainsi ce type de client considéré comme "sécurisé", en raison d'un accès restreint, les jetons peuvent être enregistrés et Kickstarter peut accéder aux ressources des utilisateurs et même actualiser les jetons d'accès sans interaction de l'utilisateur.
Si l'agent utilisateur et le client sont couplés (par exemple application mobile native, application javascript), le workflow d'autorisation implicite peut être appliqué. Il repose sur la présence du propriétaire de la ressource (pour la saisie des informations d'identification) et ne prend pas en charge les jetons d'actualisation. Si ce client stocke le jeton d'accès pour une utilisation ultérieure, ce sera un problème de sécurité, car le jeton peut être facilement extrait par d'autres applications ou utilisateurs du client. L'absence du jeton d'actualisation est un indice supplémentaire, que cette méthode n'est pas conçue pour accéder aux ressources de l'utilisateur en l'absence de l'utilisateur.
la source
L'explication habituelle est que la subvention implicite est plus facile à implémenter lorsque vous utilisez un client JavaScript. Mais je pense que ce n'est pas la bonne façon de voir les choses. 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. *
L'octroi du code d'autorisation offre une sécurité supplémentaire, mais il ne fonctionne que lorsque vous avez un serveur Web demandant les ressources protégées. Étant donné que le serveur Web peut stocker le jeton d'accès, vous courez moins de risques que le jeton d'accès soit exposé à Internet et vous pouvez émettre un jeton qui dure longtemps. Et comme le serveur Web est fiable, il peut recevoir un "jeton d'actualisation", afin qu'il puisse obtenir un nouveau jeton d'accès lorsque l'ancien expire.
Mais - et c'est un point qui est 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 établie avec l'authentification des utilisateurs (connexion). Sans session, un utilisateur non fiable pourrait simplement faire des demandes au serveur Web, en utilisant le client_id, et ce serait la même chose que si l'utilisateur avait le jeton d'accès. L'ajout d'une session 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 mettre fin à la session avant l'expiration du jeton OAuth. Il n'existe aucun moyen standard d'invalider un jeton d'accès. Mais si votre session expire, le jeton d'accès est inutile, car personne ne le sait sauf 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 y accède, il peut l'utiliser jusqu'à son expiration. Cela signifie qu'ils y auront accès plus longtemps qu'avec une autorisation de 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.
* EDIT: Plus récemment, les gens recommandent d'éviter d'utiliser la subvention implicite, même sur les applications Web sans serveur. Au lieu de cela, vous pouvez utiliser l'autorisation de code d'autorisation configurée avec un secret vide, avec PKCE. L'accord de code d'authentification évite de stocker le jeton d'accès dans l'historique de votre navigateur, et PKCE évite de l'exposer si quelqu'un détourne l'URL de redirection pour voler le code d'authentification. Dans ce cas, vous auriez besoin du serveur pour éviter de retourner un jeton d'actualisation, car votre client ne peut probablement pas le stocker en toute sécurité. Et il devrait émettre un jeton d'accès avec les mêmes limitations mentionnées ci-dessus.
la source
Cela se résume à: Si un utilisateur exécute une application Web (JavaScript) basée sur un navigateur ou "publique", sans composant côté serveur, alors l'utilisateur fait implicitement confiance à l'application (et au navigateur où elle s'exécute, potentiellement avec un autre navigateur). basées sur les applications ...).
Il n'y a pas de serveur distant tiers, uniquement le serveur de ressources. Il n'y a aucun avantage à un code d'autorisation, car il n'y a pas d' autre agent que le navigateur agissant au nom de l'utilisateur. Les informations d'identification du client ne présentent aucun avantage pour la même raison. ( Tout client peut tenter d'utiliser ce flux.)
Les implications pour la sécurité sont cependant importantes. Sur http://tools.ietf.org/html/rfc6749#section-10.3 :
Sur http://tools.ietf.org/html/rfc6749#section-10.16 :
la source
Je ne suis pas sûr d'avoir bien compris la réponse et le commentaire de Dan. Il me semble que la réponse a énoncé certains faits, mais elle précise exactement ce que OP a demandé. Si je comprends bien, le principal avantage du flux de subventions implicites est qu'un client comme l'application JS (par exemple l'extension Chrome) n'a pas à divulguer le secret du client.
Dan Taflin a déclaré:
Je vous ai peut-être mal compris, mais le client (application JS dans ce cas) doit transmettre les informations d'identification 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 «conservé de JS».
la source
Tandis que qu'Implicit Grant ait été conçu pour prendre en charge les applications qui ne pouvaient pas protéger un secret client, y compris les applications JavaScript côté client, certains fournisseurs implémentent une alternative utilisant le code d'autorisation sans secret client à la place. L'OAuth 2.0 IETF RFC-6749 a été publié en 2012 et les recommandations actuelles, certaines discussions récentes datent de 2017.
La discussion de 2017 sur la liste de diffusion IETF OAuth est disponible auprès de ces implémenteurs:
En savoir plus ici:
Le passage au code d'authentification sans secret client à partir de la subvention implicite est également mentionné pour les applications mobiles ici:
la source
en plus des autres réponses, il est également important de se rendre compte que le profil implicite permet un flux de canal avant uniquement par opposition au flux de code d'autorisation qui nécessite un rappel au serveur d'autorisation; cela devient évident dans OpenID Connect qui est un protocole SSO construit au-dessus d'Auth 2.0 où le flux implicite ressemble à la liaison SAML POST assez populaire et le flux de code d'autorisation ressemble à la liaison SAML Artifact moins largement déployée
la source
Dans le flux implicite, si le navigateur de l'utilisateur est corrompu (extension malveillante / virus), la corruption accède aux ressources de l'utilisateur et peut faire le mal.
Dans le flux d'authentification, la corruption ne peut pas car elle ne connaît pas le secret du client.
la source
https://tools.ietf.org/html/rfc6749#page-8
la source
Je pense que Will Cain a répondu à cette question en disant: "Il n'y a aucun avantage pour les informations d'identification du client pour la même raison. (Tout client peut essayer d'utiliser ce flux.)" Considérez également que le redirect_uri pour le flux implicite peut être "localhost" - pas de rappel est créé à partir du serveur d'autorisation pour le flux implicite. Comme il n'y a aucun moyen de faire confiance au client, l'utilisateur devrait approuver la libération des revendications utilisateur.
la source
La subvention implicite permet d'obtenir des jetons du point de terminaison d'autorisation avec a
GET
. Cela signifie que le serveur d'autorisation n'a pas à prendre en charge CORS.Si ce n'est pas un problème et qu'aucun autre problème lié au serveur d'autorisation n'a été inflexible (par exemple, les jetons d'actualisation ne sont pas facultatifs, pour une raison quelconque), le flux de code d'autorisation est le préféré, même pour les clients publics, selon les tendances récentes de l'industrie. et au moins cette instance (actuelle) d'un projet officiel .
Historiquement, il y avait d'autres raisons pour implémenter le flux implicite, mais il semble qu'elles soient actuellement contrebalancées par les avantages de sécurité fournis par le code d'autorisation, notamment:
la source
Je viens de faire face à un article sur OAuth 2.0. L'auteur indique que la raison du flux implicite est que les applications JS étaient très limitées dans leurs demandes:
https://medium.com/securing/what-is-going-on-with-oauth-2-0-and-why-you-should-not-use-it-for-authentication-5f47597b2611
la source