web-dev-qa-db-fra.com

Comment les bibliothèques JS côté client pour OAuth2 conservent-elles l'authentification sécurisée?

Je suis nouveau sur OAuth2 et il y a un problème avec lequel je me bats et malgré les recherches, je n'arrive toujours pas à comprendre.

La difficulté d'avoir un client JS pour OAuth2 est que vous ne pouvez pas stocker le secret du client, car il sera largement accessible dans le navigateur. C'est à dire. dans cette SO question le commentaire le mieux noté dit:

"Je pense que les paramètres tokenSecret et consumerSekret sont censés être secrets! Comment pourraient-ils rester secrets lorsqu'ils sont téléchargés sur le navigateur? !!!"

Par conséquent, comment les frameworks OAuth2 côté client comme hello.js ou oauth.io surmontent-ils ce problème? Je sais qu'ils utilisent un proxy côté serveur (qui connaît l'ID et le secret) pour leurs demandes, mais le code JS client doit encore en quelque sorte dire au proxy qui il est. Alors, qu'est-ce qui empêche quiconque de prendre le code JS de mon site Web et de parler au proxy en mon nom?

J'ai également trouvé la Bibliothèque cliente des API Google pour JavaScript . AFAIK là le code client ne passe pas un secret. Dois-je comprendre correctement qu'ils gèrent cela en ayant une adresse de réponse prédéfinie OAuth? (Afin que les jetons soient toujours renvoyés via une adresse HTTP prédéfinie). Donc, même si quelqu'un essaie d'usurper l'identité de mon site Web par en utilisant mon identifiant, les jetons seront toujours retournés sur mon site Web?

Peut-être que je confond quelques sujets différents ici, toute lumière sur le sujet serait appréciée.

32
machinery

Il existe des flux dans OAuth2 qui ne nécessitent pas de secret (par exemple, implicit le flux est généralement utilisé pour les clients JS, les SPA, etc.). Cependant, tous les fournisseurs ne prennent pas en charge ce flux, donc dans ces situations, vous avez besoin d'un composant côté serveur qui négocie cela pour vous, puis gère les interactions avec votre frontal/appareil.

Dans tous les cas, vous devez vous authentifier. Le secret authentifie le client (votre application), pas l'utilisateur. L'URL de retour (ou rappel) protège le jeton à publier ailleurs (uniquement votre application).

Des exemples de ces flux sont ici: https://docs.auth0.com/protocols#5

Mise à jour: Il existe un protocole d'échange de code/jeton spécifique pour les "clients publics" qui ajoute une sécurité supplémentaire: PKCE (comment cela fonctionne est ici: https://auth0.com/docs/protocols#oauth2-pkce-for-public-clients )

21
Eugenio Pace

Dans le cas d'un client JS, Google valide que l'origine JS correspond à celle enregistrée avec l'ID client. Donc, si quelqu'un utilise l'ID client de quelqu'un d'autre, il ne peut tout au plus obtenir un jeton que pour les comptes qu'il possède (ce qui ne sera pas très utile).

En général, vous ne pouvez jamais savoir qui/quel client (ou code) parle à votre serveur. Vous ne voyez que les données qu'ils envoient. Donc, si les mêmes paquets sont envoyés par d'autres clients/codes, il n'y a rien que vous puissiez faire et en général, vous ne devriez pas vous en soucier. Vous devez vous assurer que vous disposez des informations d'identification appropriées dans la demande.

4
nvnagr