Use connect-redis y tenga redis como su almacén de sesiones para todos los usuarios autenticados. Asegúrese de que en la autenticación envíe la clave (normalmente req.sessionID) al cliente. Haga que el cliente almacene esta clave en una cookie.
En socket connect (o en cualquier momento posterior), obtenga esta clave de la cookie y envíela de vuelta al servidor. Obtenga la información de la sesión en redis usando esta clave. (Obtener la clave)
P.ej:
Lado del servidor (con redis como tienda de sesiones):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Lado del cliente:
//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();
socket.on('connect', function() {
var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
socket.send({rediskey: rediskey});
});
Lado del servidor:
//in io.on('connection')
io.on('connection', function(client) {
client.on('message', function(message) {
if(message.rediskey) {
//fetch session info from redis
redisclient.get(message.rediskey, function(e, c) {
client.user_logged_in = c.username;
});
}
});
});
GetCookie
es la función de JavaScript.También me gustó la forma en que pusherapp hace los canales privados .
Porque también
socket.io
tiene un socket_id único para cada socket.Utilizaron cadenas de autorización firmadas para autorizar a los usuarios.
Todavía no he reflejado esto
socket.io
, pero creo que podría ser un concepto bastante interesante.fuente
Sé que esto es un poco antiguo, pero para los futuros lectores, además del enfoque de analizar la cookie y recuperar la sesión del almacenamiento (por ejemplo, passport.socketio ), también podría considerar un enfoque basado en token.
En este ejemplo, utilizo JSON Web Tokens, que son bastante estándar. Tienes que darle a la página del cliente el token, en este ejemplo imagina un punto final de autenticación que devuelve JWT:
Ahora, su servidor socket.io se puede configurar de la siguiente manera:
El middleware socket.io-jwt espera el token en una cadena de consulta, por lo que desde el cliente solo tiene que adjuntarlo al conectarse:
Escribí una explicación más detallada sobre este método y las cookies aquí .
fuente
Aquí está mi intento de que funcione lo siguiente:
Dado que es posible que también desee agregar algunas solicitudes de API, también usaremos el paquete http para que tanto HTTP como Web socket funcionen en el mismo puerto.
server.js
El siguiente extracto solo incluye todo lo que necesita para configurar las tecnologías anteriores. Puedes ver la versión completa de server.js que utilicé en uno de mis proyectos aquí .
sockets / index.js
Nuestro
socketConnectionHandler
, simplemente no me gusta poner todo dentro de server.js (aunque perfectamente podría hacerlo), especialmente porque este archivo puede terminar conteniendo bastante código bastante rápido.Material extra (cliente):
Solo una versión muy básica de lo que podría ser el cliente JavaScript socket.io:
Referencias:
Simplemente no podía hacer referencia dentro del código, así que lo moví aquí.
1: Cómo configurar sus estrategias de Passport: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
fuente
Este artículo ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) muestra cómo
Usando este código, también puede obtenerlos en socket.io.
fuente
use session y redis entre c / s
// lado del servidor
fuente
esto debería hacerlo
fuente