Métodos de autenticación sobre sockets.

Estoy intentando que la autenticación funcione a través de sockets con sailsjs y passport .

El desafío parece ser el hecho de que una conexión de socket no tiene una sesión y que sailsjs simula un objeto de solicitud, lo que hace que no tenga una configuración de middleware de Passport. Esto causó que nodejs generara un error, diciendo que el objeto req no tenía un método llamado logIn .

Por lo tanto, he intentado seguir el fragmento de código proporcionado por @xdissent aquí: autenticación de Sails.js + Passport.js a través de websockets que, de hecho, me permite iniciar sesión sin lanzar errores. ¿O es que …? Resulta que hace algo , pero no tengo idea de qué. Debido a que al obtener req.user través de una solicitud diferente (socket), me devuelven un objeto vacío.

También he mirado en redis. Esto salió de esto:

 redis 127.0.0.1:6379> keys * 1) "waterline:broadcasting:_sequences:id" 2) "sess:aDJI0YHzh17E3AMjtKsZSijs" redis 127.0.0.1:6379> get "sess:aDJI0YHzh17E3AMjtKsZSijs" "{\"cookie\":{\"httpOnly\":true,\"path\":\"/\"}}" redis 127.0.0.1:6379> 

Así que hay una sesión, simplemente no hay ningún usuario almacenado en ella.

En pocas palabras, ¿cómo consigo el pasaporte y los sailsjs para jugar bien sobre sockets?

Actualización : me gustaría alguna información sobre sesiones, sockets y cookies con velas en general. Así que si configuro cosas en una sesión y actualizo el navegador, me gustaría que todavía estuviera allí. Si hago una llamada xhr en la misma página que la conexión de socket, ¿no debería ser la misma sesión?

Gracias a Kasper Isager , habrá un generador de pasaportes para sails.js en un futuro próximo (Sails.js versión 0.10).

Implementa Passport mediante el uso de políticas (navegar por middleware).

api / services / passport.js

 var passport = require('passport'); passport.serializeUser(function(user, next) { next(null, user.id); }); passport.deserializeUser(function(id, next) { User.findOne(id).done(next); }); // Put your Passport config logic here // Make passport globally available module.exports = passport; 

api / policy / passport.js

 module.exports = function (req, res, next) { // Initialize Passport passport.initialize()(req, res, function () { // Use the built-in sessions passport.session()(req, res, function () { // Make the user available throughout the frontend res.locals.user = req.user; next(); }); }); }; 

config / policy.js

 module.exports.policies = { '*': [ 'passport' ], // MyCustomController: { // update: [ // 'passport', // 'authorize' // ] // } }; 

Esto hará que los métodos de solicitud de pasaporte (logIn, etc.) también estén disponibles en las solicitudes de socket.

Después de un inicio de sesión exitoso, su objeto de sesión del lado del servidor se verá así:

 { // Express cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' }, // Passport passport: { user: '52fc98e108b31348a537fa43' // userId } } 

Puede acceder a él en cualquier política con req.session o incluso en devoluciones de llamada de socket como:

config / sockets.js

 onConnect: function(session, socket){} onDisconnect: function(session, socket){} 

Si desea ver la implementación completa de Kaspers, eche un vistazo a su repository: sails-generate-auth