L'authentification avec OAuth2 pour une application *et* un site web

Je suis le développement d'un site web qui est principalement accessible via une application, et je veux utiliser OAuth2 pour l'enregistrement de l'utilisateur et l'authentification. Puisque c'est une application Android je vais commencer à utiliser Google OAuth2 choses, car il fournit un décent de l'INTERFACE utilisateur sur Android.

Google déclare que "Vous pouvez choisir d'utiliser Google, le système d'authentification comme un moyen d'externaliser l'authentification de l'utilisateur de votre application. Cela peut éliminer le besoin de créer, de maintenir et de sécuriser un nom d'utilisateur et le mot de passe du magasin." qui est ce que je veux faire. Cependant quand je vais à travers tous leurs exemples et autres joyeusetés, je ne peux que trouver des choses à propos d'avoir un site web ou une application authentifier un utilisateur des services de Google.

Et en effet, quand je vais enregistrer mon application ("client") auprès de Google OAuth2 il y a des options pour le site web de clients et "installé" clients " (c'est à dire une application mobile), mais pas les deux. Je peux créer deux clients différents, mais j'ai lu le OAuth2 projet et je pense qu'il y aura un problème, que je vais maintenant expliquer.

Voici comment j'ai fait envisagent de travail:

L'authentification avec OAuth2 pour une application *et* un site web

  1. Utilisateur demande MyApp d'accéder à ses données privées.
  2. Application utilise Android AccountManager classe pour demander un jeton d'accès de Google Api.
  3. Android dit à l'utilisateur "de L'app 'MyApp' veut accéder à vos Informations de Base sur Google. Est-ce ok?"
  4. Utilisateur dit oui.
  5. AccountManager se connecte à Google OAuth2 serveur en utilisant les informations d'identification stockées sur le téléphone et demande un jeton d'accès.
  6. Jeton d'accès (qui suit la ligne verte) est retourné.
  7. AccountManager retourne le jeton d'accès à MyApp.
  8. MyApp envoie une requête à l'Monsite pour l'utilisateur des données privées, y compris le jeton d'accès.
  9. Monsite besoin de vérifier l'utilisateur, en utilisant le jeton d'accès. Il valide le jeton comme décrit ici, Google, "Google, est-ce jeton valide?".
  10. Maintenant, ce que je voulez à arriver, c'est que Google dit "Oui, celui qui vous l'a donnée est bien celle de l'utilisateur.", mais ce que je pense que se passera réellement (basé sur le OAuth2 projet de Google et de la documentation), c'est qu'il va dire "c'est Pas possible! Ce jeton n'est valable que pour MyApp, et vous êtes Monsite. GTFO!".

Alors, comment dois-je faire cela? Et s'il vous PLAÎT ne dites pas "Utiliser OpenID" ou "Ne pas utiliser OAuth2" ou d'autres de même inutile de réponses. Oh, et je tiens vraiment à garder à l'aide de la belle AccountManager de l'INTERFACE utilisateur plutôt que de la merde popup WebViews

Modifier

Provisoire de la réponse (j'en ferai part si ça marche!) de Nikolay est qu'il faut réellement le travail, et les serveurs de Google ne sera pas un souci où le jeton d'accès de provenance. Semble un peu peu pour moi, mais je vais voir si ça marche!!!

Mise à jour

J'ai mis en œuvre ce modèle avec Facebook au lieu de Google et il fonctionne tout à fait. Le OAuth2 serveur n'a pas de soins où le jeton d'accès vient de. Au moins, Facebook ne veut pas, donc je suppose que Google ne veut pas non plus.

À la lumière de cela, il est une très mauvaise idée de stocker des jetons d'accès! Mais nous ne voulons pas avoir à frapper Facebook/les serveurs de Google pour vérifier l'authentification pour chaque demande car il va ralentir. Probablement la meilleure chose à faire est d'ajouter un cookie d'authentification pour votre site que vous avez la main quand leur jeton d'accès est validé, mais d'une façon plus simple est de ne traiter que le jeton d'accès comme un mot de passe et de stocker une table de hachage de il. Vous n'avez pas besoin de sel, soit depuis les jetons d'accès sont vraiment vraiment long. Si les étapes ci-dessus deviennent quelque chose comme:

9. Monsite besoin de vérifier l'utilisateur, en utilisant le jeton d'accès. D'abord, il vérifie son cache de hachage valide les jetons d'accès. Si la valeur de hachage de la clé cryptographique est trouvé, il sait que l'utilisateur est authentifié. Sinon, il vérifie avec Google comme décrit ici, Google, "Google, est-ce jeton valide?".

10. Si Google dit le jeton d'accès n'est pas valide, nous indiquent à l'utilisateur de GTFO. Sinon, Google dit "Oui, c'est un utilisateur valide" et nous, consultez notre enregistrés l'utilisateur de la base de données. Si ce nom d'utilisateur Google (ou Facebook id si vous utilisez Facebook) n'est pas trouvé, nous pouvons créer un nouvel utilisateur. Puis nous cache la valeur de hachage du jeton d'accès.

  • Curieux - fait au-dessus de l'approche de travailler pour vous à la fin?
  • Je n'ai même pas encore mise en oeuvre, désolé!
  • Voir mise à jour question: Il a travaillé au moins pour Facebook.
  • J'ai mis en place cette façon, il est de travail. De l'API Google, Google Play sur Android, et de ré-utiliser le jeton sur le côté serveur dans mon Spring3 app.
  • +1 pour le bien expliqué question, y compris très utile diagramme. Voudrais donner un autre +1 pour le partage des résultats...
  • Merci. Une mise à jour, je n'ai pas d'ajouter: facebook fait recommandons de stocker les jetons d'accès dans la base de données, puisque vous en avez besoin pour faire des trucs sur le facebook de serveurs (en supposant que vous voulez). Il n'est probablement pas une mauvaise idée de stocker les mots de passe, car si la base de données est compromise (et vous vous rendez compte), vous pouvez invalider tous la fuite des jetons d'accès.

InformationsquelleAutor Timmmm | 2012-07-24