Como posso compartilhar uma sessão com Socket.io 1.0 e Express 4.x? Eu uso uma Loja Redis, mas acredito que isso não importe. Eu sei que tenho que usar um middleware para olhar os cookies e buscar a sessão, mas não sei como. Eu procurei, mas não consegui encontrar nenhum trabalho
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Mas se eu imprimir a sessão em minhas rotas, recebo todas as variáveis de sessão que configurei (nome de usuário, id, etc.)Apenas um mês e meio atrás, eu lidei com o mesmo problema e depois escrevi uma extensa postagem no blog sobre esse tópico, que acompanha um aplicativo de demonstração totalmente funcional hospedado no GitHub. A solução depende dos módulos express-session , cookie-parser e connect-redis node para amarrar tudo. Ele permite que você acesse e modifique sessões de ambos os contextos REST e Sockets, o que é bastante útil.
As duas partes cruciais são a configuração do middleware:
... e configuração do servidor SocketIO:
Eles vêm juntos com um módulo simples de sessionService que criei, que permite que você faça algumas operações básicas com sessões e esse código se parece com isto:
Já que há mais código para a coisa toda do que isso (como inicializar módulos, trabalhar com sockets e chamadas REST no cliente e no servidor), não colarei todo o código aqui, você pode visualizá-lo no GitHub e você pode fazer o que quiser com ele.
fonte
express-socket.io-session
é uma solução pronta para o seu problema. Normalmente, a sessão criada no socket.io end tem sid diferente dos criados em express.js
Antes de saber disso, quando estava trabalhando para encontrar a solução, achei algo um pouco estranho. As sessões criadas a partir da instância express.js eram acessíveis no final do socket.io, mas o mesmo não era possível para o contrário. E logo descobri que tenho que trabalhar meu caminho através do gerenciamento de Sid para resolver esse problema. Mas, já havia um pacote escrito para lidar com esse problema. É bem documentado e faz o trabalho. Espero que ajude
fonte
Usando a resposta de Bradley Lederholz, é assim que eu fiz funcionar para mim. Consulte a resposta de Bradley Lederholz para obter mais explicações.
fonte
Eu meio que resolvi, mas não é perfeito. Não suporta cookies assinados, etc. Eu usei a função getcookie de express-session . A função modificada é a seguinte:
fonte
Agora, a resposta original aceita também não funciona para mim. Da mesma forma que @ Rahil051, usei o módulo express-socket.io-session e ainda funciona. Este módulo usa um analisador de cookies para analisar o id da sessão antes de entrar no middleware de sessão expressa. Acho que é silmiar para a resposta de @pootzko, @Mustafa e @ Kosar.
Estou usando estes módulos:
verifique os dados em socket.handshake:
fonte