2012-08-31 2 views
3

socket.io가 세션을 조회 할 때 쿠키의 ID가 데이터베이스의 ID와 일치하지 않기 때문에 핸드 셰이크 오류가 발생합니다. Express3, mongodb, connect-mongodb 및 socket.io를 사용하고 있습니다. v0.9.10socket.io 쿠키 구문 분석 핸드 셰이크 오류

예를 들어, socket.io 코드의 console.log (data.sessionID) 결과는 다음과 같습니다.

"_id" : "eFFkUnQXWdTO7GBRDc11No/a", 

이가의 후 data.sessionID에 해당 볼 수 있듯이 : 난 내 데이터베이스에 세션 컬렉션을 볼 때

s:eFFkUnQXWdTO7GBRDc11No/a.U6voj5QnxKs1skq766nO7/qJvPEJA73KaQM67qNEs/k

하지만, 나는 다음과 같은 _id를 얻을 기간 전에. 두 개의 다른 쿠키 파서를 사용하여 시도했다. 아래 파서에 대한 코드는 표현 3에 포함되어있는 쿠키 모듈에서 온 것입니다. 모든 쿠키 ID가이 패턴을 따르는 지 확신 할 수 없기 때문에 결과를 다시 구문 분석해야하는지 알지 못합니다. 잘못하고있다.

exports.parseCookie = function(str) { 
var obj = {} 
var pairs = str.split(/[;,] */); 
var encode = encodeURIComponent; 
var decode = decodeURIComponent; 

pairs.forEach(function(pair) { 
    var eq_idx = pair.indexOf('=') 
    var key = pair.substr(0, eq_idx).trim() 
    var val = pair.substr(++eq_idx, pair.length).trim(); 

    // quoted values 
    if ('"' == val[0]) { 
     val = val.slice(1, -1); 
    } 

    // only assign once 
    if (undefined == obj[key]) { 
     obj[key] = decode(val); 
    } 
}); 

return obj; 

}};

아래 코드는 'connect.sid'속성이 데이터베이스의 id 속성과 일치하지 않기 때문에 핸드 셰이크 오류가 발생합니다.

io.set('authorization', function (data, accept) { 

    if (data.headers.cookie) { 
     data.cookie = utils.parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['connect.sid']; 
     // **************** // 
     console.log(data.sessionID); 
     // **************** // 
     sessionStore.get(data.sessionID, function (err, session) { 
      if (err || ! session) { 
       accept('Error', false); 
      } else { 
       data.session = session; 
       data.session.url = data.headers.referer; 
       accept(null, true); 
      } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

답변

1

IT는 sessionStore 키는 이제 짧은 UID (24)를 전용 버전과 더 이상 쿠키에 저장되어있는 '긴'버전 것 같다.

잠시 동안 ('.') [0] 간단한 uid (24) 부분을 검색하여 수정했습니다. data.sessionID = cookie [ 'express.sid']. split ('. ') [0];

+0

이것이 작동하는 동안 나는 매우 취약하고 쿠키 표현을 변경하면 깨질 것입니다. 아래에 답변을 게시했습니다.이 API는 개인 API를 사용하더라도 취약하지 않아야합니다. –

3

동일한 문제가 발생하여 솔루션이 작동하는 동안 사용중인 parseCookie 기능이 이전 버전의 연결에서 제공됩니다. 이제 연결의 새 코드가 해당 기간 이후의 추가 문자 인 쿠키에 서명합니다.

express와 connect의 헛소리를 뒤적 거리며 나는 다음 코드를 생각해 냈다. 그것은 connect (utils.parseSignedCookies)의 private API 함수에 달려 있지만 적어도 동일한 코드를 사용하여 쿠키를 생성하는 데 사용한 것과 동일한 코드를 사용하므로 향후 쿠키 변경 방법에 조금 덜 민감해야합니다. 생성 및 구문 분석.

/* cookie: the cookie string from the request headers 
* sid: the session 'key' used with express.session() 
* secret: the session 'secret' used with express.session() 
*/ 
function parseSessionCookie(cookie, sid, secret) { 
    var cookies = require('express/node_modules/cookie').parse(cookie) 
    , parsed = require('express/node_modules/connect/lib/utils').parseSignedCookies(cookies, secret) 
    ; 
    return parsed[sid] || null; 
} 

socketIO.set('authorization', function(data, accept) { 
    var sid = parseSessionCookie(data.headers.cookie, 'express.sid', 'secret'); 
    if (sid) { 
    sessionStore.get(sid, function(err, session) { 
     if (err || !session) { 
     accept('Error', false); 
     } else { 
     data.session = session; 
     accept(null, true); 
     } 
    }); 
    } else { 
    return accept('No cookie transmitted.', false); 
    } 
}); 
+0

코드 주셔서 감사합니다. – starsinmypockets