Nous avons un site Web où le seul moyen de vous connecter et de vous authentifier avec le site est avec Facebook (ce n'était 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 et également une API publique pour que d'autres puissent utiliser notre service.
Cette question concerne la manière de s'authentifier auprès de notre site Web depuis l'application / l'API et est divisée en 2 parties:
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 beaucoup lu et fait de nombreuses recherches sur les méthodes standard d'authentification pour l'API REST. Nous ne pouvons pas utiliser des méthodes telles que l' authentification de base sur HTTPS , car il n'y a pas d'informations d'identification pour un utilisateur en tant que tel. Quelque chose comme cela semble être uniquement pour authentifier les applications à l'aide de l'API.
Actuellement, la meilleure façon de penser est que vous atteignez un point final / autoriser sur notre API, qu'il redirige vers Facebook OAuth, puis redirige vers le site et fournit un `` jeton '' que l'utilisateur de l'API peut utiliser pour s'authentifier ultérieurement. demandes.
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 parler à notre site Web et d'authentifier les utilisateurs?
Je comprends (je pense) comment authentifier les applications tierces qui utilisent notre API, en utilisant des clés API (publiques) et des clés secrètes (privées). Cependant, quand il s'agit d'authentifier l'utilisateur qui utilise l'application, je ne sais pas trop comment s'y prendre alors que le seul moyen d'authentifier un utilisateur est Facebook.
J'ai l'impression de manquer quelque chose de très évident ou de ne pas comprendre pleinement comment les API REST publiques devraient fonctionner, donc tout conseil et aide seraient grandement appréciés.
Réponses:
MISE À JOUR: voir ci-dessous
J'ai aussi beaucoup réfléchi à cette question. Ce n'est pas encore tout à fait clair pour moi, mais voici l'itinéraire que je pense emprunter. Je crée une API REST et mes utilisateurs ne s'authentifient qu'avec Facebook Connect.
Sur le CLIENT:
Sur l'API (pour chaque méthode nécessitant une authentification de l'utilisateur):
Je n'ai pas encore testé cela. Comment ça sonne?
--- Mise à jour: 27 juillet 2014 pour répondre à la question ---
Je n'utilise l'échange ci-dessus qu'une seule 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. Donc, le nouveau flux ressemble à ceci ...
Sur le CLIENT:
Sur l'API
la source
Ceci est mon implémentation utilisant des JWT (jetons Web JSON), fondamentalement similaire à la réponse mise à jour de Chris. J'ai utilisé Facebook JS SDK et JWT.
Voici ma mise en œuvre.
Client: utilisez Facebook JS SDK pour vous connecter et obtenir le jeton d'accès.
Client: demandez JWT à mon API en appelant
/verify-access-token
endpoint.MyAPI: reçoit le jeton d'accès, vérifiez-le en appelant le
/me
point de terminaison de l'API Facebook.MyAPI: si le jeton d'accès est valide, trouve l'utilisateur dans la base de données, enregistre l'utilisateur s'il existe. Créez un JWT avec les champs obligatoires comme charge utile, définissez une expiration, signez avec la clé secrète et renvoyez-le au client.
Client: stocke le JWT dans le stockage local.
Client: envoie le jeton (le JWT de l'étape 5) avec la demande du prochain appel d'API.
MyAPI: validez le token avec la clé secrète, si le token est valide, échangez le token contre un nouveau, renvoyez-le 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é, demandez au client de s'authentifier à nouveau et de répéter à partir de 1]
Client Remplace le jeton stocké par le nouveau et l'utilise pour le prochain appel d'API. Une fois l'expiration du jeton atteinte, le jeton expire en révoquant l'accès à l'API.
Chaque jeton est utilisé une fois.
Lire plus de réponses sur la sécurité et JWT
Quelle est la sécurité de JWT
Si vous pouvez décoder JWT, comment sont-ils sécurisés?
Jetons Web JSON (JWT) en tant que jetons d'identification et d'authentification des utilisateurs
la source
/debug_token
, vous pouvez donc vérifier que le jeton est bien pour votre application.access_token
dans le client. Utilisez le "flux de travail de code". Passezcode
à MyAPI et faites un autre aller-retour sur Facebook pour échangercode
avecaccess_token
. Ceci est expliqué plus en détail ici: développeurs.facebook.comJ'essaie de répondre à la même question et j'ai beaucoup lu récemment ...
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 vraiment intéressants et utiles.
En conséquence, et à la lumière de la façon dont les choses ont évolué depuis la rédaction du premier article, voici ce que je pense que je vais faire:
HTTPS partout - cela vous permet d'oublier HMAC, signature, nonce, ...
Utilisez OAuth2:
Lorsque les demandes d'authentification proviennent de mes propres applications / site Web, utilisez cette «astuce» (ou une variante de celle-ci) décrite dans une réponse à l'article mentionné précédemment.
Dans mon cas, j'ai deux types d'utilisateurs: ceux qui ont des identifiants de connexion / mot de passe classiques et ceux qui se sont inscrits avec Facebook Connect.
Je fournirais donc un formulaire de connexion régulier avec un bouton "Connexion avec Facebook". Si l'utilisateur se connecte avec ses informations d'identification "classiques", je les enverrais simplement à mon point de terminaison OAuth2 avec un
grant_type=password
.S'il choisit de se connecter via Facebook, je pense que ce serait un processus en deux étapes:
Veuillez noter que je fais encore beaucoup de recherches sur tout cela, donc ce n'est peut-être pas une réponse parfaite ... peut-être même pas la bonne! Mais je pense que cela constituerait un bon point de départ. L'idée d'utiliser une "subvention d'extension" pour l'authentification Facebook pourrait impliquer de devoir l'enregistrer pour faire les choses correctement? Je ne suis pas sûr.
Quoi qu'il en soit, j'espère avoir pu vous aider encore un peu, et qu'au moins ça pourra démarrer une discussion pour trouver la meilleure solution à ce problème :)
Mise à jour
La connexion Facebook n'est pas une solution comme indiqué dans les commentaires: n'importe qui peut envoyer un identifiant d'utilisateur arbitraire et se connecter en tant que cet utilisateur sur l'API.
Que diriez-vous de le faire comme ceci:
Regarde mieux?
la source