Comment gère-t-on l'authentification (locale et Facebook, par exemple) à l'aide de passport.js, via une API RESTful plutôt que via une interface Web?
Des problèmes spécifiques concernent le passage des données de callback à une réponse RESTful (JSON) par opposition à 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 utilisé). accessible via AJAX, car il ne s'agit pas d'une réponse JSON - il s'agit d'une redirection vers Facebook avec rappel.
J'ai trouvé https://github.com/halrobertson/test-restify-passport-facebook , mais j'ai du mal à comprendre.
En outre, comment passport.js stocke-t-il les informations d’authentification? Le serveur (ou est-ce que c'est un service?) Est supporté par MongoDB, et je m'attendrais à ce que les informations d'identification (login & salted hash de pw) soient stockées ici, mais je ne sais pas si passport.js possède ce type de capacité.
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 passport.js), les vraies questions portent davantage sur le flux de travail que sur la manière de le faire avec un logiciel particulier. La technologie.
Utilisons l'exemple de configuration @Keith, modifié un peu pour plus de sécurité:
https://example.com
sert une application cliente Javascript d'une seule pagehttps://example.com/api
fournit un support serveur à l'application client enrichihttps://example.com/api
https://example.com/api
mais je ne connais pas le serveur Web à https://example.com
.Notez que j'utilise HTTP sécurisé. Ceci est à mon avis un must pour tout service disponible à la volée, car des informations sensibles telles que les mots de passe et les jetons d'autorisation passent entre le client et le serveur.
Regardons d'abord comment fonctionne l'ancienne authentification.
https://example.com
https://example.com/api
pour obtenir les données spécifiques à l'utilisateur à afficher sur la page. Chaque demande envoyée 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 étant RESTful n'est pas autorisé à conserver l'état du client d'une demande à l'autre. suivant. Comme le service Web est sur HTTP sécurisé, le mot de passe est crypté en toute sécurité pendant le transit.https://example.com/api
reçoit un ensemble de requêtes individuelles, chacune contenant des informations d'authentification. Le nom d'utilisateur et le mot de passe de chaque requête sont comparés à la base de données utilisateur. Si la requête est correcte, elle 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 client en plus de l'authentification de l'utilisateur. Par exemple, si vous avez le client Web, iOS et Android applications qui utilisent toutes le service Web, vous voudrez peut-être que le serveur sache lequel des trois clients le client d’une requête donnée est Ceci peut permettre à votre service Web de restreindre certaines fonctions à des clients spécifiques.Pour cela, vous pouvez utiliser des clés et des secrets d’API, voir cette réponse pour des idées à ce sujet.
Le processus 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
La route est gérée par passport.js (voir le documentation )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
route appellera la fonction de rappel qui reçoit le jeton d'accès Facebook et certaines informations utilisateur de Facebook, y compris l'adresse électronique de l'utilisateur.https://example.com/api
inclura le jeton d'accès Facebook pour l'authentification ou le jeton d'accès propre à 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.
J'apprécie grandement l'explication de @ Miguel avec le flux complet dans chaque cas, mais j'aimerais en ajouter quelques-unes dans la partie Authentification Facebook.
Facebook fournit un Javascript SDK que vous pouvez utiliser pour obtenir directement le jeton d'accès client-end, qui est ensuite transmis au serveur et utilisé pour extraire toutes les informations utilisateur de Facebook. Donc, vous n'avez pas besoin de ré-orienter fondamentalement.
De plus, vous pouvez également utiliser le même noeud final d'API pour les applications mobiles. Utilisez simplement le Android/iOS SDK pour Facebook, obtenez le code 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. Donc, c’est aussi bon qu’un jeton de session et je crois que cela le rend dynamique?
Juste mes 2 cents ..
Voici un article génial que j'ai trouvé et qui peut vous aider à vous authentifier avec: