OAuth 2.0 a plusieurs flux de travail. J'ai quelques questions concernant les deux.
- Flux de code d'autorisation - L'utilisateur se connecte à partir de l'application cliente, le serveur d'autorisation renvoie un code d'autorisation à l'application. L'application échange ensuite le code d'autorisation contre un jeton d'accès.
- Flux d'octroi implicite - L'utilisateur se connecte à partir de l'application cliente, le serveur d'autorisation émet un jeton d'accès directement à l'application cliente.
Quelle est la différence entre les deux approches en termes de sécurité? Lequel est le plus sûr et pourquoi?
Je ne vois pas de raison pour laquelle une étape supplémentaire (échange du code d'autorisation pour le jeton) est ajoutée dans un flux de travail lorsque le serveur peut émettre directement un jeton d'accès.
Différents sites Web indiquent que le flux de code d'autorisation est utilisé lorsque l'application cliente peut sécuriser les informations d'identification. Pourquoi?
Réponses:
C'est
access_token
ce dont vous avez besoin pour appeler une ressource protégée (une API). Dans le flux de code d'autorisation, il y a 2 étapes pour l'obtenir:code
au consommateur d'API (appelé le «client»).code
obtenu en # 1 contre unaccess_token
, s'authentifiant avec unclient_id
etclient_secret
access_token
.Donc, il y a une double vérification: l'utilisateur qui possède les ressources apparues 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é. Remarquez la nature «d'autorisation» d'OAuth ici: l'utilisateur accorde l'accès à sa ressource (via le
code
renvoi après authentification) à une application, l'application obtient unaccess_token
, et appelle au nom de l'utilisateur.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 avecaccess_token
peut, alors que dans l'exemple précédent, seule l'application Web le ferait (ce sont les composants internes normalement accessibles à personne)Le flux implicite est généralement utilisé dans des scénarios où le stockage
client id
etclient secret
ne sont pas recommandés (un dispositif par exemple, bien que beaucoup le font de toute façon). C'est ce que signifie l'avertissement. Les gens 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 il n'y a rien de stocké dans l'application.la source
/authorize
demande. Le navigateur et le site Web essayant d'appeler l'API (alias le client). C'est leredirect_uri
+code
renvoyé par l'AS après une authentification réussie. Enfin, le client appelle l'AS dans les coulisses, échangeant lecode
pour unaccess_token
. C'est letoken endpoint
dans la littérature. En général, l'AS n'appelle jamais personne. Il répond toujours.J'ajouterai ici quelque chose qui, à mon avis, n'est pas clair 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 source
access_token
avec l'aide deauthorization code
.La différence entre les deux est que:
Dans un flux implicite, le jeton est retourné directement via l'URL de redirection avec le signe "#" et cela est principalement utilisé dans les clients javascript ou les applications mobiles qui n'ont pas de côté serveur à part entière, 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, le côté serveur doit fournir cette fois le secret client au jeton url pour obtenir le jeton en tant qu'objet json du serveur d'autorisation. Il est utilisé dans le cas où vous avez un serveur d'applications capable de gérer cela et de 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 client, quel "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 client sur une connexion très sécurisée, et le fournisseur d'autorisation peut restreindre certains clients à n'utiliser que le «code d'autorisation» et interdire implicite
la source
L'octroi implicite est similaire à l'octroi de code d'autorisation avec deux différences distinctes.
Il est destiné à être utilisé pour les clients basés sur des agents utilisateurs (par exemple, des applications Web à page unique) qui ne peuvent pas garder un client secret car tout le code d'application et le stockage sont facilement accessibles.
Deuxièmement, au lieu que le serveur d'autorisation renvoie un code d'autorisation qui est échangé contre un jeton d'accès, le serveur d'autorisation renvoie un jeton d'accès.
Veuillez trouver les détails ici http://oauth2.thephpleague.com/authorization-server/which-grant/
la source
Flux implicite
Avantages
Désavantages
Flux de code d'autorisation
Avantages
Désavantages
Citation: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
la source
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.
Flux de code d'autorisation !!!
Flux de subvention implicite !!!
la source
Les deux sont sécurisés, cela dépend de l'environnement dans lequel vous l'utilisez.
C'est simple. Votre client n'est pas sécurisé. Voyons cela en détails.
Considérez que vous développez une application contre
Instagram API
, donc vous enregistrez votre APP avecInstagram
et définissez ce dontAPI's
vous avez besoin.Instagram
vous fourniraclient_id
etclient_secrect
Sur votre site Web, vous créez un lien qui dit. "Venez utiliser mon application". En cliquant dessus, votre application Web doit effectuer deux appels
Instagram API
.First
envoyer une demande àInstagram Authentication Server
avec les paramètres ci-dessous.Vous n'envoyez pas
client_secret
, vous ne pouviez pas faire confiance au client (l'utilisateur et / ou son navigateur qui essaient d'utiliser votre application). Le client peut voir l'url ou le script java et trouverclient_secrect
facilement votre fichier. C'est pourquoi vous avez besoin d'une autre étape.Vous recevez un
code
etstate
. L'code
ici esttemporary
et n'est enregistré nulle part.Ensuite, vous passez un
second
appel àInstagram API
(depuis votre serveur)Comme l'appel est effectué depuis notre serveur, nous pouvons utiliser en toute sécurité
client_secret
(ce qui montre comment nous sommes) aveccode
quels spectacles l'utilisateur a autorisé l'client_id
utilisation de la ressource.En réponse, nous aurons
access_token
la source
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 établit si le propriétaire de la ressource accorde ou refuse la demande d'accès du client"
En dehors de cela, à l'aide de jetons d'actualisation, les applications peuvent obtenir un accès à long terme aux données des utilisateurs.
la source
Il semble y avoir deux points clés, non abordés jusqu'à présent, qui expliquent pourquoi le détour dans le type d'autorisation de code d'autorisation ajoute de la sécurité.
Petite histoire : Le type d'octroi de code d'autorisation conserve les informations sensibles de l'historique du navigateur et la transmission du jeton dépend uniquement de la protection HTTPS du serveur d'autorisation.
Version plus longue:
Dans ce qui suit, je m'en tiendrai à la terminologie OAuth 2 définie dans la RFC (c'est une lecture rapide): serveur de ressources , client , serveur d'autorisation , propriétaire de la ressource .
Imaginez que vous souhaitiez qu'une application tierce (= client) accède à certaines données de votre compte Google (= serveur de ressources). Supposons simplement que Google utilise OAuth 2. Vous êtes le propriétaire de la ressource du compte Google, mais vous exploitez actuellement l'application tierce.
Tout d'abord, le client ouvre un navigateur pour vous envoyer vers l'URL sécurisée du serveur d'autorisation Google. Ensuite, vous approuvez la demande d'accès et le serveur d'autorisation vous renvoie à l'URL de redirection précédemment donnée par le client, avec le code d'autorisation dans la chaîne de requête. Passons maintenant aux deux points clés:
Avec le type d'autorisation de code d'autorisation, le jeton est finalement obtenu par un appel du client au serveur d'autorisation, où la sécurité de la transmission dépend uniquement du serveur d'autorisation et non du client.
la source