Je développe un site Web auquel on accède principalement via une application, et je veux utiliser OAuth2 pour l'enregistrement et l'authentification des utilisateurs. Comme il s'agit d'une application Android, je vais commencer à utiliser le matériel OAuth2 de Google, car il offre une interface utilisateur décente sur Android.
Google indique que "Vous pouvez choisir d'utiliser le système d'authentification de Google comme un moyen d'externaliser l'authentification des utilisateurs pour votre application. Cela peut supprimer la nécessité de créer, maintenir et sécuriser un magasin de noms d'utilisateur et de mots de passe." ce qui est ce que je veux faire. Cependant quand je regarde tous leurs exemples et autres, je ne trouve que des trucs pour avoir un site web. ou une application authentifie un utilisateur auprès des services de Google.
En effet, lorsque j'enregistre mon application ("client") dans OAuth2 de Google, des options sont proposées pour les clients de sites web et les clients "installés" (c'est-à-dire une application mobile), mais pas les deux. Je peux créer deux clients distincts mais j'ai lu le projet OAuth2 et je pense qu'il y aura un problème, que je vais maintenant expliquer.
Voici comment j'ai envisagé le fonctionnement :
- L'utilisateur demande à MyApp d'accéder à ses données privées.
- L'application utilise la fonction
AccountManager
pour demander un jeton d'accès aux API de Google. - Android dit à l'utilisateur "L'application 'MyApp' veut accéder à vos informations de base sur Google. Est-ce que cela vous convient ?"
- L'utilisateur dit oui.
-
AccountManager
se connecte au serveur OAuth2 de Google à l'aide des informations d'identification stockées sur le téléphone et demande un jeton d'accès. - Le jeton d'accès (qui suit les lignes vertes) est renvoyé.
-
AccountManager
renvoie le jeton d'accès à MyApp. - MyApp envoie une demande à MySite pour les données privées de l'utilisateur, y compris le jeton d'accès.
- MySite doit vérifier l'utilisateur, en utilisant le jeton d'accès. Il valide le jeton comme décrit ici avec Google - "Google, ce jeton est-il valide ?".
- Maintenant, ce que je veulent Je pense que Google répondra "Oui, la personne qui vous l'a donné est bien cet utilisateur", mais je pense que ce qui se passera réellement (d'après le projet OAuth2 et la documentation de Google), c'est qu'il dira "Pas question ! Ce jeton n'est valable que pour MyApp, et vous êtes MySite. DÉGAGEZ !".
Comment dois-je m'y prendre ? Et s'il vous plaît, ne dites pas "Utilisez OpenID" ou "N'utilisez pas OAuth2" ou d'autres réponses aussi peu utiles. Oh, et j'aimerais vraiment continuer à utiliser l'agréable AccountManager
Une interface utilisateur plutôt qu'un popup pourri WebView
s
Modifier
La réponse provisoire (je ferai un rapport si ça marche !) de Nikolay est que ça devrait fonctionner et que les serveurs de Google ne se soucient pas de la provenance du jeton d'accès. Cela me semble peu sûr, mais je verrai si cela fonctionne !
Mise à jour
J'ai mis en œuvre ce modèle avec Facebook au lieu de Google et cela fonctionne parfaitement. Le serveur OAuth2 ne se soucie pas de l'origine du jeton d'accès. Du moins, celui de Facebook ne s'en soucie pas, donc je suppose que celui de Google non plus.
Dans ces conditions, c'est une très très mauvaise idée de stocker des jetons d'accès ! Mais nous ne voulons pas non plus avoir à frapper les serveurs de Facebook/Google pour vérifier l'authentification de chaque car cela va tout ralentir. La meilleure solution consiste probablement à ajouter un cookie d'authentification supplémentaire pour votre site que vous remettez lorsque le jeton d'accès est validé, mais une solution plus simple consiste à traiter le jeton d'accès comme un mot de passe et à en stocker un hachage. Il n'est pas non plus nécessaire de le saler puisque les jetons d'accès sont vraiment très longs. Ainsi, les étapes ci-dessus deviennent quelque chose comme :
9. MySite doit vérifier l'utilisateur, en utilisant le jeton d'accès. Il vérifie d'abord son cache de jetons d'accès valides hachés. Si le hachage du jeton s'y trouve, il sait que l'utilisateur est authentifié. Sinon, il vérifie auprès de Google comme décrit ici avec Google - "Google, ce jeton est-il valide ?".
10. Si Google dit que le jeton d'accès n'est pas valide, nous disons à l'utilisateur de dégager. Sinon, Google dit "Oui, c'est un utilisateur valide" et nous vérifions alors notre base de données des utilisateurs enregistrés. Si le nom d'utilisateur Google (ou l'identifiant Facebook si vous utilisez Facebook) n'est pas trouvé, nous pouvons créer un nouvel utilisateur. Ensuite, nous mettons en cache la valeur hachée du jeton d'accès.