Comment gère-t-on l'authentification (locale et Facebook, par exemple) à l'aide de passeport.js, via une API RESTful plutôt que via une interface Web?
Les problèmes spécifiques concernent la gestion du passage des données des rappels à une réponse RESTful (JSON) par rapport à l'utilisation d'un res.send typique ({data: req.data}), la configuration d'un point de terminaison initial / login qui redirige vers Facebook (/ login ne peut pas être accessible via AJAX, car ce n'est pas une réponse JSON - c'est une redirection vers Facebook avec un rappel).
J'ai trouvé https://github.com/halrobertson/test-restify-passport-facebook , mais j'ai du mal à le comprendre.
De plus, comment passeport.js stocke-t-il les informations d'authentification? Le serveur (ou est-ce un service?) Est soutenu par MongoDB, et je m'attendrais à ce que les informations d'identification (connexion et hachage salé de pw) y soient stockées, mais je ne sais pas si passeport.js a ce type de capacité.
la source
passport-facebook
. Une fois que cela fonctionne, l'étape suivante consiste à commencer à comprendre comment fonctionne Passport et comment il stocke les informations d'identification. Le connecter à Restify ( voir ici pour une version mise à jour de celui que vous mentionnez) serait l'une des dernières étapes (ou vous pourriez implémenter l'interface REST dans Express).Réponses:
Il y a beaucoup de questions posées ici, et il semble que même si les questions sont posées dans le contexte de Node et de passport.js, les vraies questions concernent plus le flux de travail que la façon de le faire avec une technologie particulière.
Utilisons l'exemple de configuration @Keith, modifié un peu pour plus de sécurité:
https://example.com
sert une application cliente Javascript sur une seule pagehttps://example.com/api
fournit une prise en charge du serveur à l'application client richehttps://example.com/api
https://example.com/api
mais ne connaissent pas le serveur Web àhttps://example.com
.Notez que j'utilise HTTP sécurisé. C'est à mon avis un must pour tout service disponible à l'air libre, car des informations sensibles telles que les mots de passe et les jetons d'autorisation passent entre le client et le serveur.
Authentification par nom d'utilisateur / mot de passe
Voyons d'abord comment fonctionne l'authentification ancienne.
https://example.com
https://example.com/api
pour obtenir les données spécifiques à l'utilisateur à afficher sur la page. Chaque demande qu'ils envoient au service Web comprendra le nom d'utilisateur et le mot de passe, éventuellement sous la forme d'une authentification HTTP Basic , car le service RESTful n'est pas autorisé à maintenir l'état du client d'une demande à l'autre. Le service Web étant sur HTTP sécurisé, le mot de passe est chiffré en toute sécurité pendant le transit.https://example.com/api
reçoit un tas de demandes individuelles, chacune avec des informations d'authentification. Le nom d'utilisateur et le mot de passe de chaque demande sont vérifiés par rapport à la base de données utilisateur et, s'ils sont trouvés corrects, la fonction demandée s'exécute et les données sont renvoyées au client au format JSON. Si le nom d'utilisateur et le mot de passe ne correspondent pas, une erreur est envoyée au client sous la forme d'un code d'erreur HTTP 401.Le point important à retenir de cet exemple est que les services Web RESTful nécessitent une authentification à chaque demande .
Une couche de sécurité supplémentaire dans ce scénario ajouterait une autorisation d'application cliente en plus de l'authentification utilisateur. Par exemple, si vous avez le client Web, les applications iOS et Android qui utilisent tous le service Web, vous voudrez peut-être que le serveur sache lequel des trois est le client d'une demande donnée, quel que soit l'utilisateur authentifié. Cela peut permettre à votre service Web de restreindre certaines fonctions à des clients spécifiques. Pour cela, vous pouvez utiliser des clés API et des secrets, voir cette réponse pour quelques idées à ce sujet.
Authentification Facebook
Le flux de travail ci-dessus ne fonctionne pas pour Facebook connect car la connexion via Facebook a un tiers, Facebook lui-même. La procédure de connexion nécessite que l'utilisateur soit redirigé vers le site Web de Facebook où les informations d'identification sont entrées en dehors de notre contrôle.
Voyons donc comment les choses changent:.
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
itinéraire est géré par passeport.js (voir la documentation )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
itinéraire appellera la fonction de rappel qui reçoit le jeton d'accès Facebook et certaines informations utilisateur de Facebook, y compris l'adresse e-mail de l'utilisateur.https://example.com/api
incluront le jeton d'accès Facebook pour l'authentification, ou le propre jeton d'accès de l'application généré à partir du jeton Facebook via une fonction «get_access_token» dans l'API REST.J'espère que cela répond à la plupart des questions. Bien sûr, vous pouvez remplacer Facebook par Twitter, Google ou tout autre service d'authentification basé sur OAuth.
Je serais intéressé de savoir si quelqu'un a un moyen plus simple de gérer cela.
la source
Every single request they send to the web service will include the username and password
, et pourtant vous ditesyou can have a "get_access_token" function in your RESTful service
. Il semble contradictoire de dire que REST doit être sans état, mais le stockage des jetons d'accès côté serveur est OK, car cet acte de stockage des jetons d'accès signifie que le serveur est maintenant avec état. J'apprécierais toute clarification ou justification à ce sujet. Merci! :)J'apprécie beaucoup l'explication de @ Miguel avec le flux complet dans chaque cas, mais j'aimerais en ajouter dans la partie Authentification Facebook.
Facebook fournit un SDK Javascript que vous pouvez utiliser pour obtenir directement le jeton d'accès côté client, qui est ensuite transmis au serveur et utilisé pour extraire davantage toutes les informations utilisateur de Facebook. Vous n'avez donc pas besoin de redirection.
De plus, vous pouvez également utiliser le même point de terminaison API pour les applications mobiles. Utilisez simplement le SDK Android / iOS pour Facebook, obtenez le jeton d'accès Facebook du côté client et transmettez-le au serveur.
En ce qui concerne la nature sans état, comme expliqué, lorsque get_access_token est utilisé pour générer un jeton et transmis au client, ce jeton est également stocké sur le serveur. C'est donc aussi bon qu'un jeton de session et je pense que cela le rend avec état?
Juste mes 2 cents ...
la source
Voici un article génial que j'ai trouvé qui peut vous aider à vous authentifier avec:
Authentification facile des nœuds: configuration et locale
la source