OAuth 2.0 a plusieurs flux de travail. J'ai quelques questions concernant les deux.
Quelle est la différence entre les deux approches en termes de sécurité? Lequel est le plus sécurisé et pourquoi?
Je ne vois pas pourquoi une étape supplémentaire (code d'autorisation d'échange de jeton) est ajoutée dans un flux de travail lorsque le serveur peut directement émettre un jeton d'accès.
Différents sites Web indiquent que le flux de code d'autorisation est utilisé lorsque l'application client peut conserver les informations d'identification en toute sécurité. Pourquoi?
Le access_token
est ce dont vous avez besoin pour appeler une ressource protégée (une API). Dans le flux de codes d'autorisation, il existe 2 étapes pour l'obtenir:
code
au consommateur d'API (appelé "client").code
obtenue dans # 1 contre un access_token
, en s'authentifiant avec un client_id
et un client_secret
.access_token
.Il y a donc un double contrôle: l'utilisateur qui possède les ressources mises en surface via une API et le client utilisant l'API (par exemple, une application Web). Les deux sont validés pour que l'accès soit accordé. Notez la nature "autorisation" de OAuth ici: l'utilisateur accorde l'accès à sa ressource (via la code
renvoyée après l'authentification) à une application, l'application obtient un access_token
et appelle de son côté.
Dans le flux implicite, l'étape 2 est omise. Ainsi, après l'authentification de l'utilisateur, un access_token
est renvoyé directement, que vous pouvez utiliser pour accéder à la ressource. L'API ne sait pas qui appelle cette API. N'importe qui avec le access_token
peut le faire, alors que dans l'exemple précédent, seule l'application Web le serait (ses composants internes ne sont normalement accessibles à personne).
Le flux implicite est généralement utilisé dans des scénarios où il n'est pas recommandé de stocker client id
et client secret
(un périphérique par exemple, bien que beaucoup le fassent quand même). C'est ce que le disclaimer signifie. Les utilisateurs ont accès au code client et peuvent donc obtenir les informations d'identification et prétendre devenir des clients ressources. Dans le flux implicite, toutes les données sont volatiles et rien n'est stocké dans l'application.
Je vais ajouter quelque chose ici qui, à mon avis, n'est pas précisé dans les réponses ci-dessus:
tl; dr n'utilisez pas de flux implicite si vous ne faites pas confiance à la machine des utilisateurs pour détenir des jetons mais que vous faites confiance à vos propres serveurs.
La différence entre les deux est que:
Dans le flux implicite, le jeton est renvoyé directement via une URL de redirection avec le signe "#", utilisé principalement dans les clients javascript ou les applications mobiles n'ayant pas de côté serveur, et le client n'a pas besoin de fournir son secret dans certaines implémentations. .
Dans le flux de code d'autorisation, le code est renvoyé avec "?" pour être lisible par le côté serveur, alors le côté serveur doit fournir le secret client cette fois à l'adresse de jeton pour obtenir le jeton en tant qu'objet json à partir du serveur d'autorisation. Il est utilisé dans le cas où un serveur d'applications peut gérer cela et stocker le jeton d'utilisateur avec son profil sur son propre système, et principalement utilisé pour les applications mobiles courantes.
cela dépend donc de la nature de votre application cliente, lequel "code d'autorisation" plus sécurisé car il demande le secret sur le client et le jeton peut être envoyé entre le serveur d'autorisation et l'application cliente sur une connexion très sécurisée, et le fournisseur d'autorisation peut interdire à certains clients de n'utiliser que le "code d'autorisation" et d'interdire implicite
L'attribution implicite est similaire à l'attribution du code d'autorisation avec deux différences distinctes.
Il est destiné à être utilisé par les clients utilisant des agents d’utilisateur (par exemple, des applications Web à page unique) qui ne peuvent pas garder un client secret car tout le code de l’application et le stockage sont facilement accessibles.
Deuxièmement, au lieu que le serveur d'autorisation retourne un code d'autorisation qui est échangé contre un jeton d'accès, le serveur d'autorisation retourne un jeton d'accès.
Veuillez trouver les détails ici http://oauth2.thephpleague.com/authorization-server/which-grant/
Permettez-moi de résumer les points que j'ai appris des réponses ci-dessus et d'ajouter certaines de mes propres compréhensions.
Citation: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
Lequel est le plus sécurisé et pourquoi?
Les deux sont sécurisés, cela dépend de l'environnement dans lequel vous l'utilisez.
Je ne vois pas pourquoi une étape supplémentaire (code d'autorisation d'échange Pour le jeton) est ajoutée dans un flux de travail lorsque le serveur peut directement émettre un jeton d'accès.
C'est simple. Votre client n'est pas sécurisé. Voyons cela en détail.
Considérez que vous développez une application avec Instagram API
, vous enregistrez donc votre application avec Instagram
et définissez le API's
dont vous avez besoin. Instagram
vous fournira client_id
et client_secrect
Sur votre site Web, vous créez un lien qui dit. "Viens et utilise mon application". En cliquant sur ceci, votre application Web doit effectuer deux appels vers Instagram API
.
First
envoyer une demande à Instagram Authentication Server
avec les paramètres ci-dessous.
1. `response_type` with the value `code`
2. `client_id` you have get from `Instagram`
3. `redirect_uri` this is a url on your server which do the second call
4. `scope` a space delimited list of scopes
5. `state` with a CSRF token.
Vous n'envoyez pas client_secret
, vous ne pouviez pas faire confiance au client (l'utilisateur et/ou son navigateur essayant d'utiliser votre application). Le client peut voir l'URL ou le script Java et trouver facilement votre client_secrect
. C'est pourquoi vous avez besoin d'une autre étape.
Vous recevez un code
et un state
. La code
ici est temporary
et n'est enregistrée nulle part.
Ensuite, vous appelez second
pour Instagram API
(à partir de votre serveur)
1. `grant_type` with the value of `authorization_code`
2. `client_id` with the client identifier
3. `client_secret` with the client secret
4. `redirect_uri` with the same redirect URI the user was redirect back to
5. `code` which we have already received.
Comme l'appel est effectué depuis notre serveur, nous pouvons utiliser en toute sécurité client_secret
(qui montre notre statut) avec code
qui indique à l'utilisateur qu'il a accordé client_id
pour utiliser la ressource.
En réponse, nous aurons access_token
D'un point de vue pratique (ce que j'ai compris), la principale raison d'avoir un flux de code Authz est:
"Le serveur d'autorisation authentifie le propriétaire de la ressource (via l'agent utilisateur) et détermine si le propriétaire de la ressource accorde ou refuse la demande d'accès du client"
En dehors de cela, en utilisant des jetons d'actualisation, les applications peuvent obtenir un accès à long terme aux données de l'utilisateur.