Estou usando o Express Framework. Quero acessar os dados da sessão de socket.io. Tentei expressar dynamicHelpers com dados de client.listener.server.dynamicViewHelpers, mas não consigo obter dados de sessão. Existe uma maneira simples de fazer isso? Por favor veja o código
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
Respostas:
Isso não funcionará para sockets passando pelo transporte flashsocket (não envia ao servidor os cookies necessários), mas funciona de forma confiável para todo o resto. Acabei de desabilitar o transporte flashsocket no meu código.
Para fazer funcionar, no lado expresso / conexão, defino explicitamente o armazenamento de sessão para que possa usá-lo dentro do soquete:
Em seguida, dentro do meu código de soquete, incluo a estrutura de conexão para que possa usar sua análise de cookies para recuperar o connect.sid dos cookies. Em seguida, procuro a sessão no armazenamento de sessão que tem esse connect.sid assim:
Você pode então usar a sessão conforme necessário.
fonte
A solução do módulo Socket.IO-sessions expõe o aplicativo a ataques XSS, expondo a ID da sessão no nível do cliente (script).
Em vez disso, verifique esta solução (para Socket.IO> = v0.7). Veja a documentação aqui .
fonte
socket.io
é o que está expondo o ID da sessão, não aquele módulo. Isso não é um grande problema, já que o ID da sessão é armazenado do lado do cliente em um cookie de qualquer maneira ... Além disso, esse tutorial não funciona para a versão mais recente do Express.socket.io
página do github ..?Eu sugiro não reinventar totalmente a roda. As ferramentas de que você precisa já são um pacote npm. Acho que é disso que você precisa: session.socket.io Estou usando hoje em dia e será muito útil, acho !! Vincular a sessão expressa à camada socket.io terá muitas vantagens!
fonte
Edit: Depois de tentar alguns módulos que não funcionaram, eu na verdade escrevi minha própria biblioteca para fazer isso. Plugue sem vergonha: vá dar uma olhada em https://github.com/aviddiviner/Socket.IO-sessions . Vou deixar meu antigo post abaixo para fins históricos:
Eu fiz este trabalho perfeitamente sem ter que contornar o transporte flashsocket conforme a solução do pr0zac acima. Também estou usando o expresso com Socket.IO. Veja como.
Primeiro, passe o ID da sessão para a vista:
Em sua visão, vincule-o ao lado do cliente Socket.IO:
Em seguida, no listener Socket.IO do lado do servidor, pegue-o e leia / grave os dados da sessão:
No meu caso, o meu
session_store
é Redis, usando aredis-connect
biblioteca.Espero que isso ajude alguém que encontra esta postagem enquanto pesquisa no Google (como eu fiz;)
fonte
Veja isto: Autenticação Socket.IO
Eu sugeriria não buscar nada via
client.request...
ou,client.listener...
pois isso não está diretamente anexado aoclient
objeto e sempre aponta para o último usuário conectado!fonte
Confira Socket.IO-connect
Conecte o WebSocket Middleware Wrapper Around Socket.IO-node https://github.com/bnoguchi/Socket.IO-connect
Isso permitirá que você envie a (s) solicitação (ões) Socket.IO para baixo na pilha de middleware Express / Connect antes de manipulá-la com manipuladores de eventos Socket.IO, dando a você acesso à sessão, cookies e muito mais. Embora não tenha certeza de que funcione com todos os transportes do Socket.IO.
fonte
Você pode usar express-socket.io-session .
Compartilhe um middleware de sessão expressa baseado em cookie com socket.io. Funciona com express> 4.0.0 e socket.io> 1.0.0 e não é compatível com versões anteriores.
Funcionou para mim !!
fonte
Você pode dar uma olhada em: https://github.com/bmeck/session-web-sockets
ou, alternativamente, você pode usar:
Espero que isto ajude.
fonte
Não tenho certeza se estou fazendo certo. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Com os dados do handshake, você pode acessar os cookies. E nos cookies, você pode pegar connect.sid, que é o id de sessão de cada cliente. Em seguida, use o connect.sid para obter os dados da sessão do banco de dados (presumo que você esteja usando o RedisStore)
fonte