2013-10-23 1 views
1

socket.io에서 세션 변수에 액세스하는 악명 높은 문제를 해결하려고합니다. 기본적으로 주제와 관련하여 Google의 모든 링크를 읽었으며 여전히 고민 중입니다.Express 쿠키 세션 키가 데이터 헤더에 표시되지 않음

내 모든 라우팅 후 나는이 있습니다

io.set('authorization', function(data,accept) 
{ 
    data.cookie = cookie.parse(data.headers.cookie); 
    ---> console.log(data.cookie); 
    data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret); 

    sessionStore.get(data.sessionID, function (err, session) 
    { 
     console.log(session); 
    }); 
}); 

불행하게도, 나는 반환이에 화살표를 그린 CONSOLE.LOG :

{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' } 

그래서 물론, 나는 오류에 대한 얻을 express.sid가 정의되지 않았습니다. express.sid를 connect.sid로 변경하면 세션 변수가 정의되지 않습니다.

나는이 문제를 해결하기 위해 정말로 고심하고있다. 나는 몇 시간 동안 그것을 해왔다. 어떤 도움이 필요합니까?

편집 : 내 클라이언트가 내 서버의 포트 포워딩, 외부 IP 버전에 연결되었다

  • 내가 대신 세션의 cookieSession을 사용하고 있었다의 app.config에서

    1. : 내 해결 된 문제를 요약합니다. 쿠키 데이터를 전송하지 않았습니다.
    2. . 세션 ID를 찾을 때 .split ('.') [0] .substring (2)가 절대적으로 필요합니다.
    3. io.set ('인증, 함수 (핸드 셰이크, 콜백) socket.io 연결 순서 "콜백 (NULL, TRUE)"당신은 아주 가까이있어 일반적으로
  • 답변

    1

    를 진행합니다.이 파서에 전달되기 전에 당신은 실제로 쿠키를 수정할 필요가 없습니다.

    io.set('authorization', function(handshake, callback) { 
        handshake.cookie = cookie.parse(handshake.headers.cookie); 
        handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret); 
    
        sessionStore.get(handshake.sessionID, function(err, session) { 
        // the session would be here 
        }); 
    }); 
    

    그러나 쿠키 파서 미들웨어에 액세스 할 수 있으므로 개인적으로 다음을 수행합니다.

    var parseCookie = express.cookieParser(conf.sessionSecret); 
    io.set('authorization', function(handshake, callback) { 
        if (handshake.headers.cookie) { 
        parseCookie(handshake, null, function(err) { 
         handshake.sessionID = handshake.signedCookies['express.sid']; 
         sessionStore.get(handshake.sessionID, function(err, session) { 
         // the session would be here 
         }); 
        }); 
        } 
    }); 
    

    이 방법은 쿠키의 구문 분석하는 동안 가능합니다 오류를 수집하고 HTTP 요청 객체 인 것처럼 그들은 모두 headers.cookie 속성을 가지고 있기 때문에, handshake 객체를 전달하여 작동합니다. 그러면 쿠키 파서가 쿠키를 구문 분석하여 handshake 개체에 할당하므로 handshake.signedCookies에서 세션 ID를 찾을 수 있습니다.

    +1

    아, 예,'headers.cookie' 부분을 제거하십시오. 죄송합니다 실수도, 예제를 편집합니다. – hexacyanide

    +1

    handshake.signedCookies가 비어 있습니다. 왜 그렇게 될지 아십니까? – Harangue

    +0

    더 많은 코드를 보여줄 수 있습니까? – hexacyanide