86 votes

API REST pour un site web qui utilise Facebook pour l'authentification

Nous disposons d'un site web où les sólo Pour se connecter et s'authentifier sur le site, il faut passer par Facebook (ce n'est pas mon choix). La première fois que vous vous connectez avec Facebook, un compte est automatiquement créé pour vous.

Nous voulons maintenant créer une application iPhone pour notre site ainsi qu'une API publique pour que d'autres puissent utiliser notre service.

Cette question porte sur la manière de s'authentifier auprès de notre site web à partir de l'application/API et se décompose en 2 parties :

  1. Quelle est la bonne façon de gérer l'authentification REST d'une API vers un site web qui utilise uniquement Facebook OAuth comme méthode d'authentification ?

J'ai lu et recherché beaucoup de choses sur les méthodes standard d'authentification pour l'API REST. Nous ne pouvons pas utiliser des méthodes telles que Auth de base sur HTTPS car il n'y a pas d'informations d'identification pour un utilisateur en tant que tel. Quelque chose comme este semble être uniquement destiné à l'authentification des applications utilisant l'API.

Actuellement, la meilleure façon de procéder est d'utiliser un point de terminaison /authorize sur notre API, qui redirige vers Facebook OAuth, puis vers le site et fournit un "jeton" que l'utilisateur de l'API peut utiliser pour authentifier les demandes ultérieures.

  1. Pour une application officielle que nous créons, nous n'aurions pas nécessairement besoin d'utiliser l'API publique de la même manière. Quelle serait alors la meilleure façon de communiquer avec notre site web et d'authentifier les utilisateurs ?

Je comprends (je pense) comment authentifier les applications tierces qui utilisent notre API, en utilisant les clés API (publiques) et les clés secrètes (privées). Cependant, lorsqu'il s'agit d'authentifier l'utilisateur qui utilise l'application, je ne sais pas trop comment m'y prendre alors que le seul moyen dont nous disposons pour authentifier un utilisateur est Facebook.

J'ai l'impression de passer à côté de quelque chose de très évident, ou de ne pas bien comprendre comment les API REST publiques devraient fonctionner, donc tout conseil et toute aide seraient grandement appréciés.

100voto

Chris Greenwood Points 234

MISE À JOUR : voir ci-dessous

J'ai également beaucoup réfléchi à cette question. Ce n'est pas encore tout à fait clair pour moi, mais voici la voie que je pense suivre. Je suis en train de créer une API REST pour mes utilisateurs. sólo authentification avec Facebook connect.

Sur le CLIENT :

  1. Utilisez l'API Facebook pour vous connecter et obtenir un code OAUTH2.
  2. Echangez ce code contre un jeton d'accès.
  3. Dans chaque appel à mon API personnalisée, j'inclurai l'identifiant de l'utilisateur Facebook et le jeton d'accès.

Sur l'API (pour chaque méthode nécessitant une authentification de l'utilisateur) :

  1. Faites une demande au graphique Facebook /me en utilisant le jeton d'accès ci-dessus.
  2. Vérifiez que l'identifiant de l'utilisateur Facebook renvoyé correspond à l'identifiant de l'utilisateur transmis à mon API ci-dessus.
  3. Si le jeton d'accès a expiré, une communication supplémentaire est nécessaire.

Je ne l'ai pas encore testé. Quel est le son ?

--- Mise à jour : 27 juillet 2014 pour répondre à la question ---

Je n'utilise l'échange ci-dessus qu'une fois lors de la connexion. Une fois que j'ai déterminé quel utilisateur se connecte, je crée mon propre jeton d'accès, et ce jeton est utilisé à partir de ce moment-là. Le nouveau flux ressemble donc à ceci...

Sur le CLIENT :

  1. Utilisez l'API Facebook pour vous connecter et obtenir un code OAUTH2.
  2. Echangez ce code contre un jeton d'accès.
  3. Demander un jeton d'accès à mon API, en incluant le jeton Facebook comme paramètre

Sur l'API

  1. Réception de la demande de jeton d'accès.
  2. Faire une demande au graphique Facebook /me en utilisant le jeton d'accès facebook
  3. Vérifier que l'utilisateur Facebook existe et qu'il correspond à un utilisateur de ma base de données.
  4. Créer mon propre jeton d'accès, l'enregistrer et le renvoyer au client pour qu'il l'utilise à partir de maintenant.

15voto

Marty Points 1097

Voici ma mise en œuvre des JWT (JSON Web Tokens), similaire à la réponse mise à jour de Chris. J'ai utilisé le SDK JS de Facebook et les JWT.

Voici comment je procède.

  1. Client : Utilisez le SDK JS de Facebook pour vous connecter et obtenir le jeton d'accès.

  2. Client : Demander un JWT à mon API en appelant /verify-access-token point final.

  3. MyAPI : Reçoit un jeton d'accès, le vérifie en appelant /me de l'API Facebook.

  4. MyAPI : Si le jeton d'accès est valide, il recherche l'utilisateur dans la base de données et le connecte s'il existe. Créer un JWT avec les champs requis comme charge utile, définir une date d'expiration, signer avec la clé secrète et renvoyer au client.

  5. Client : Enregistre le JWT dans le stockage local.

  6. Client : Envoie le jeton (le JWT de l'étape 5) avec la demande pour le prochain appel à l'API.

  7. MyAPI : valider le jeton avec la clé secrète, si le jeton est valide, échanger le jeton contre un nouveau, le renvoyer au client avec la réponse de l'API. (Aucun appel d'API externe pour la vérification du jeton ici après) [si le jeton est invalide/expiré, demander au client de s'authentifier à nouveau et répéter à partir de 1].

  8. Client Remplace le jeton stocké par le nouveau jeton et l'utilise pour le prochain appel à l'API. Une fois l'expiration du jeton atteinte, le jeton expire et révoque l'accès à l'API.

Chaque jeton est utilisé une seule fois.

Lire d'autres réponses sur la sécurité et le JWT

Quel est le degré de sécurité du JWT ?

Si l'on peut décoder les JWT, en quoi sont-ils sûrs ?

Jetons Web JSON (JWT) pour l'identification et l'authentification des utilisateurs

5voto

Olivier Lance Points 342

J'essaie de répondre à la même question et j'ai beaucoup lu ces derniers temps...

Je n'aurai pas "la" réponse, mais les choses deviennent un peu plus claires pour moi. Avez-vous lu les commentaires dans l'article que vous avez mentionné ? Je les ai trouvés très intéressants et utiles.

En conséquence, et compte tenu de l'évolution de la situation depuis la rédaction du premier article, voici ce que je pense faire :

  • HTTPS partout - cela vous permet d'oublier HMAC, signature, nonce, ...

  • Utiliser OAuth2 :

    • Lorsque les demandes d'authentification proviennent de mes propres applications/sites web, j'utilise cette "astuce" (ou une variante de celle-ci) décrite dans un document intitulé réponse à l'article mentionné précédemment.

    • Dans mon cas, j'ai deux types d'utilisateurs : ceux qui ont des identifiants classiques et ceux qui se sont inscrits avec Facebook Connect.
      Je fournirais donc un formulaire de connexion classique avec un bouton "Connexion avec Facebook". Si l'utilisateur se connecte avec ses identifiants "classiques", je les enverrai simplement à mon point de terminaison OAuth2 avec une commande grant_type=password .
      S'il choisit de se connecter via Facebook, je pense qu'il s'agira d'une procédure en deux étapes :

      • Tout d'abord, utilisez le SDK iOS de Facebook pour ouvrir une session FBSession.
      • Lorsque cela est fait et que l'application reprend le contrôle, il devrait y avoir un moyen d'obtenir un identifiant Facebook pour cet utilisateur. J'enverrais cet identifiant seul à mon point de terminaison OAuth2 avec une commande bourse d'extension mon serveur a compris qu'il s'agissait de "l'utilisation d'un identifiant FB".

Veuillez noter que je suis encore en train de faire des recherches approfondies sur tous ces sujets, il se peut donc que cette réponse ne soit pas parfaite... peut-être même pas correcte ! Mais je pense qu'il s'agit d'un bon point de départ. L'idée d'utiliser une "subvention d'extension" pour l'authentification Facebook pourrait impliquer de l'enregistrer pour qu'elle fonctionne correctement ? Je n'en suis pas certain.

Quoi qu'il en soit, j'espère que j'ai pu vous aider ne serait-ce qu'un peu, et qu'au moins cela pourra lancer une discussion pour trouver la meilleure solution à ce problème :)

Mise à jour
Le login Facebook n'est pas une solution comme indiqué dans les commentaires : n'importe qui pourrait envoyer un ID utilisateur arbitraire et se connecter en tant que cet utilisateur sur l'API.

Pourquoi ne pas procéder de la manière suivante ?

  • Afficher un formulaire de connexion avec un bouton "Connexion Facebook".
  • Si cette méthode de connexion est choisie, agissez un peu comme le SDK Facebook : ouvrez une page web à partir de votre serveur d'authentification, qui lancera la connexion Facebook.
  • Une fois que l'utilisateur s'est connecté, Facebook utilisera votre URL de redirection pour confirmer ; faites en sorte que cette URL pointe vers un autre point de terminaison de votre serveur d'authentification (éventuellement avec un paramètre supplémentaire indiquant que l'appel provient d'une application ?)
  • Lorsque le point de terminaison d'authentification est atteint, l'authentification peut identifier l'utilisateur en toute sécurité, conserver son ID utilisateur FB/session FB et renvoyer un jeton d'accès à votre application à l'aide d'un schéma d'URL personnalisé, tout comme le ferait le SDK de Facebook.

Ça a l'air mieux ?

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