node.js - auth - Autenticación con Node/Express/Socket.IO
socketio-auth (1)
Tengo un servidor node / socket.io / express que está conectado a un archivo HTML (como ese). Entonces, visitar la dirección web lo conecta al servidor. Estoy tratando de configurar un sistema donde, dicho servidor se ejecuta en varias computadoras a la vez y mediante algún tipo de autenticación de nombre de usuario y contraseña, visitar la página web con credenciales específicas lo conecta a una de las computadoras con esas mismas características. credenciales que ejecutan el servidor.
He visto mencionar a "Redis" de anteriores preguntas similares, pero son bastante viejas y me pregunto si hay una manera más nueva o mejor de lograr esto.
No encontrará mucha documentación actualizada ya que Express 4 es algo nuevo, así que permítanme tratar de remediarlo aquí:
Autenticación en Express 4.x y Socket.IO 1.x
Comencemos con una confusión que creo que estás haciendo:
¿Qué es Redis?
Redis es un motor de estructura de datos. Le permite almacenar pares clave / valor, nada más (en este contexto). Lo único que puede hacer por usted al crear su sistema de autenticación es almacenar los datos, la información del usuario, los identificadores de sesión, etc. En su caso, puede compartir una tienda entre varias máquinas, de la misma manera que compartiría una base de datos, o un archivo de texto.
Autenticar usuario a nodo / servidor express
Una de las formas en que puede hacer eso es mediante el uso de pasaporte . Passport es un middleware dedicado a la autenticación en Node.js. Está hecho para usar con Express y es relativamente fácil de configurar. Hay una excelente serie de tutoriales sobre cómo configurar el pasaporte con su aplicación expresa, así que no detallaré esta parte, por favor tómense el tiempo para revisar la serie, es un conocimiento invaluable.
Aquí está el enlace a la primera parte , que es en la que me concentraré para el siguiente paso.
Agrega socket.io a la mezcla
Socket.io no tiene acceso a las cookies de sesión que usted crea en la parte 1. Para remediar eso, usaremos el módulo passport-socketio .
Passport-socketio requiere una tienda de sesión local, a diferencia de una tienda de memoria. Esto significa que necesitamos alguna forma de almacenar los datos de la sesión en algún lugar, ¿suena eso?
Exactamente, Redis .
Puedes probar otras tiendas, como mongoDB o MySQL, pero Redis es la más rápida.
En este ejemplo, supondré que su aplicación y pasaporte expreso ya están operativos y se centrarán en agregar socket.io a la aplicación.
Preparar :
var session = require(''express-session''); //You should already have this line in your app
var passportSocketIo = require("passport.socketio");
var io = require("socket.io")(server);
var RedisStore = require(''connect-redis'')(session);
var sessionStore = new RedisStore({ // Create a session Store
host: ''localhost'',
port: 6379,
});
app.use(session({
store: sessionStore, //tell express to store session info in the Redis store
secret: ''mysecret''
}));
io.use(passportSocketIo.authorize({ //configure socket.io
cookieParser: cookieParser,
secret: ''mysecret'', // make sure it''s the same than the one you gave to express
store: sessionStore,
success: onAuthorizeSuccess, // *optional* callback on success
fail: onAuthorizeFail, // *optional* callback on fail/error
}));
Connect-redis es un paquete de tienda de sesión que usa redis (en caso de que el nombre no sea obvio).
- Último paso :
function onAuthorizeSuccess(data, accept){
console.log(''successful connection to socket.io'');
accept(); //Let the user through
}
function onAuthorizeFail(data, message, error, accept){
if(error) accept(new Error(message));
console.log(''failed connection to socket.io:'', message);
accept(null, false);
}
io.sockets.on(''connection'', function(socket) {
console.log(socket.request.user);
});
El objeto de usuario que se encuentra en socket.request contendrá toda la información de usuario del usuario que inició sesión, puede pasarla o hacer lo que necesite con este punto.
Nota: Esta configuración será ligeramente diferente para Socket.IO <1.x