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