30 votes

Mise en œuvre de l'authentification OAuth 2.0 pour mon API

J'utilise l'API graphique Facebook (qui utilise oauth 2.0 pour l'authentification) avec succès depuis un certain temps déjà. J'ai maintenant besoin d'écrire ma propre API qui permette aux développeurs de s'y connecter de manière similaire. J'ai examiné diverses bibliothèques, mais j'aimerais quelque chose d'un peu plus léger et j'ai donc décidé de créer la mienne. En regardant le code que j'ai pour authentifier un utilisateur sur Facebook, il semble relativement simple, mais s'il vous plaît, corrigez-moi si je m'égare.

Tout d'abord, je dois fournir une page sécurisée vers laquelle le consommateur doit être redirigé, par exemple https://api.mydomain.com/oauth/authorize?client_id=CONSUMER_KEY&redirect_url=CALLBACK_URL . L'utilisateur vérifierait l'application puis je redirigerais vers l'url fournie dans l'url de rappel avec le oauth_token dans la chaîne de requête. Je suppose que je pourrais simplement générer une chaîne unique aléatoire ici pour le oauth_token et la stocker contre l'utilisateur pour ce consommateur particulier (EDIT : S'il vous plaît voir la réponse ci-dessous, cela devrait être unique pour chaque application consommateur et non l'utilisateur).

C'est l'étape 1 du chemin. Je dois maintenant fournir une deuxième page sécurisée vers laquelle le consommateur déclenchera une requête web. par exemple https://api.mydomain.com/oauth/access_token?client_id=CONSUMER_KEY&client_secret=CONSUMER_SECRET&oauth_token=OAUTH_TOKEN_RETURNED_ABOVE . Cela permettrait au consommateur d'échanger le oauth_token renvoyé ci-dessus contre un jeton d'accès. Encore une fois, je génère simplement une chaîne unique aléatoire et je la stocke dans l'utilisateur pour ce consommateur particulier.

Désormais, mon API accepterait l'access_token pour les méthodes qui tentent d'obtenir des informations spécifiques à l'utilisateur qui l'utilise.

J'aimerais savoir si j'ai bien compris. La spécification OAuth 2.0 semble extrêmement triviale si c'est le cas. De plus, pourquoi devons-nous échanger l'oauth_token avec un access_token ? J'ai ma propre idée mais j'apprécierais que quelqu'un puisse m'aider à clarifier ce point.

J'apprécierais vraiment vos commentaires car je ne veux pas perdre des heures à implémenter ce système alors qu'il est complètement faux.

Merci

48voto

Teoman Soygul Points 17544

En fait, les diagrammes de flux de protocole seraient extrêmement utiles pour visualiser des spécifications comme celles d'OAuth 2, mais il n'existe que des travaux partiels. Comme je viens de mettre en œuvre une bibliothèque OAuth 2 côté client uniquement, je peux vérifier que vous êtes sur la bonne voie. Mais il y a un hic :

oauth_token appartient à votre application cliente (par exemple, un lecteur facebook de bureau) qui authentifie votre application (tout comme un identifiant). Vous le soumettez pour obtenir en retour un access_token, qui est spécifique à votre application et à l'utilisateur connecté, et qui vous permet d'accéder à des ressources restreintes liées à l'utilisateur.

Voici un processus d'authentification de base d'une application de bureau (tiré de : http://developers.gigya.com/020_Developer_Guide/85_REST/OAuth2 )

REST OAuth 2.0

En fait, un digramme de flux avec une chronologie (de haut en bas, tirée de : http://www.ibm.com/developerworks/web/library/wa-oauthsupport/?ca=drs- )

Protocol flow

Et enfin, la procédure complète est la suivante : (tiré de http://h2anetwork.org/ProjectDocs/DPI/DPI_Framework.html )

OAuth protocol flow

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X