[session] socket.io 및 세션?

Express 프레임 워크를 사용하고 있습니다. socket.io에서 세션 데이터에 도달하고 싶습니다. client.listener.server.dynamicViewHelpers 데이터로 express dynamicHelpers를 시도했지만 세션 데이터를 가져올 수 없습니다. 이를 수행하는 간단한 방법이 있습니까? 코드를 참조하십시오

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
    }); 
});



답변

이것은 flashsocket 전송을 통과하는 소켓에 대해서는 작동하지 않지만 (서버에 필요한 쿠키를 보내지 않음) 다른 모든 것에 대해서는 안정적으로 작동합니다. 내 코드에서 flashsocket 전송을 비활성화했습니다.

작동하기 위해 Express / connect 측에서 세션 저장소를 명시 적으로 정의하여 소켓 내부에서 사용할 수 있습니다.

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

그런 다음 소켓 코드 내에 connect 프레임 워크를 포함하여 쿠키 구문 분석을 사용하여 쿠키에서 connect.sid를 검색 할 수 있습니다. 그런 다음 connect.sid가있는 세션 저장소에서 다음과 같이 세션을 찾습니다.

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

그런 다음 필요에 따라 세션을 사용할 수 있습니다.


답변

Socket.IO-sessions 모듈 솔루션은 클라이언트 (스크립팅) 수준에서 세션 ID를 노출하여 앱을 XSS 공격에 노출합니다.

대신 이 솔루션을 확인하십시오 (Socket.IO> = v0.7의 경우). 여기에서 문서를 참조 하십시오 .


답변

나는 바퀴를 완전히 재발 명하지 말 것을 제안합니다. 필요한 도구는 이미 npm 패키지입니다. 이것이 필요한 것이라고 생각합니다 : session.socket.io
요즘 사용하고 있으며 매우 도움이 될 것 같습니다 !! express-session을 socket.io 레이어에 연결하면 많은 이점이 있습니다!


답변

편집 : 작동하지 않는 일부 모듈을 시도한 후 실제로이 작업을 수행하기 위해 내 라이브러리를 작성했습니다. 뻔뻔한 플러그 : https://github.com/aviddiviner/Socket.IO-sessions 에서 확인 하세요 . 역사적인 목적으로 아래에 이전 게시물을 남겨 둘 것입니다.


위의 pr0zac 솔루션에 따라 flashsocket 전송 을 우회하지 않고도이 작업을 아주 깔끔하게 얻었습니다 . 나는 또한 Socket.IO와 함께 express를 사용하고 있습니다. 방법은 다음과 같습니다.

먼저 세션 ID를 뷰에 전달합니다.

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: {
      connect_sid: req.sessionID
      // ...
    }
  });
});

그런 다음보기에서 Socket.IO 클라이언트 측에 연결합니다.

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

그런 다음 서버 측 Socket.IO 리스너에서이를 선택하고 세션 데이터를 읽고 / 씁니다.

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

제 경우 session_store에는 redis-connect라이브러리를 사용하는 Redis 입니다.

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

이것이 Google을 검색하는 동안이 게시물을 찾는 사람에게 도움이되기를 바랍니다.


답변

참조 : Socket.IO 인증

나는 통해 아무것도 가져 오는하지 제안 client.request...또는 client.listener...그 직접 부착되지 않는 client개체를 항상 로그인 한 사용자의 마지막을 가리!


답변

Socket.IO-connect를 확인하십시오.

Socket.IO 노드 주위에 WebSocket 미들웨어 래퍼 연결
https://github.com/bnoguchi/Socket.IO-connect

이렇게하면 Socket.IO 이벤트 처리기로 처리하기 전에 Express / Connect 미들웨어 스택에서 Socket.IO 요청을 푸시하여 세션, 쿠키 등에 대한 액세스를 제공 할 수 있습니다. 비록 그것이 Socket.IO의 모든 전송과 함께 작동하는지 확신하지 못합니다.


답변

express-socket.io-session 을 사용할 수 있습니다 .

socket.io와 쿠키 기반의 익스프레스 세션 미들웨어를 공유하십시오. express> 4.0.0 및 socket.io> 1.0.0에서 작동하며 이전 버전과 호환되지 않습니다.

나를 위해 일했다!!