Use connect-redis e tenha redis como seu armazenamento de sessão para todos os usuários autenticados. Verifique se, na autenticação, você envia a chave (normalmente req.sessionID) para o cliente. Faça com que o cliente armazene essa chave em um cookie.
No socket connect (ou a qualquer momento depois), busque essa chave no cookie e envie-a de volta ao servidor. Busque as informações da sessão em redis usando esta chave. (Tecla GET)
Por exemplo:
Lado do servidor (com redis como armazenamento de sessão):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Lado do 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 do 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
é a função javascript.Também gostei da maneira como o pusherapp faz canais privados .
Porque também
socket.io
possui socket_id exclusivo para cada socket.Eles usaram cadeias de autorização assinadas para autorizar usuários.
Ainda não refleti isso
socket.io
, mas acho que poderia ser um conceito bastante interessante.fonte
Eu sei que isso é um pouco antigo, mas para futuros leitores, além da abordagem de analisar cookies e recuperar a sessão do armazenamento (por exemplo: passport.socketio ), você também pode considerar uma abordagem baseada em token.
Neste exemplo, eu uso JSON Web Tokens, que são bastante padrão. Você deve fornecer à página do cliente o token; neste exemplo, imagine um terminal de autenticação que retorne JWT:
Agora, seu servidor socket.io pode ser configurado da seguinte maneira:
O middleware socket.io-jwt espera o token em uma sequência de consultas, portanto, do cliente você só precisará anexá-lo ao conectar:
Eu escrevi uma explicação mais detalhada sobre esse método e cookies aqui .
fonte
Aqui está minha tentativa de ter o seguinte funcionando:
Como você também pode adicionar algumas solicitações de API, também usaremos o pacote http para que o soquete HTTP e Web funcionem na mesma porta.
server.js
A extração a seguir inclui apenas tudo o que você precisa para configurar as tecnologias anteriores. Você pode ver a versão completa do server.js que usei em um dos meus projetos aqui .
sockets / index.js
Nossa
socketConnectionHandler
, eu simplesmente não gosto de colocar tudo no server.js (mesmo que você possa perfeitamente), especialmente porque esse arquivo pode acabar contendo muito código rapidamente.Material extra (cliente):
Apenas uma versão muito básica do que o cliente socket.io do JavaScript poderia ser:
Referências:
Como não consegui fazer referência ao código, mudei-o para cá.
1: Como configurar suas estratégias do Passport: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
fonte
Este artigo ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) mostra como
Usando esse código, você também pode obtê-los no socket.io.
fonte
use session e redis entre c / s
// lado do servidor
fonte
Isso deve servir
fonte