2013-09-23 1 views
3

express/connect 응용 프로그램에서 서명 된 쿠키를 구문 분석하는 동안 문제가 있습니다.서명 된 쿠키 파싱 연결

io.set('authorization', function (handshakeData, callback) { 
    if(handshakeData.headers.cookie) { 
     var signedCookies = cookie.parse(decodeURIComponent(handshakeData.headers.cookie)); 
     handshakeData.cookie = connect.utils.parseSignedCookies(signedCookies, secret); 
    } else { 
     return accept('No cookie transmitted', false); 
    } 
    callback(null, true); // error first callback style 
}); 

connect.utils.parseSignedCookies은 빈 객체를 반환합니다. 나는 파싱 함수의 소스를 조사하여 인코딩 된 값의 하위 문자열을 가져온 unsign 메서드를 호출 한 다음 동일한 암호로 다시 서명하려고 시도하고 결과를 비교하여 인코딩 된 동일한 값과 몇 가지 이유로 실패하고 값이 일치하지 않습니다. 나는 왜 내가 옳지 않은지, 왜 그 가치가 다른지, 왜 올바른 세션 ID를 얻을 수 없는지 모릅니다.

내 응용 프로그램 초기화 코드는 다음과 같습니다

app.use(express.cookieParser(secret)); 
app.use(express.session({ 
    key: 'sessionID', 
    secret: secret, 
    maxAge: new Date(Date.now() + 3600000), 
    store: new RedisStore({ 
     client: redisClient 
    }) 
})); 

도움과 내가 잘못 여기서 뭘하는지 지적 해주십시오. 고마워요

답변

2

쿠키 파서는 미들웨어이므로 하나와 같이 사용해야합니다. 실제로 전달한 객체를 채 웁니다. 이것은 당신이 파서 사용하고 싶을 방법입니다 쿠키 파서 API가 변경

// we need to use the same secret for Socket.IO and Express 
var parseCookie = express.cookieParser(secret); 

io.set('authorization', function(handshake, callback) { 
    if (handshake.headers.cookie) { 
    // pass a req, res, and next as if it were middleware 
    parseCookie(handshake, null, function(err) { 
     // use handshake.signedCookies, since the 
     // cookie parser has populated it 
    }); 
    } else { 
    return accept('No session.', false); 
    } 
    callback(null, true); 
}); 

를이 지금처럼 보이는 것입니다 : 우리가 handshake을 통과 무슨 일을하는지 그래서

module.exports = function cookieParser(secret) { 
    return function cookieParser(req, res, next) { 
    if (req.cookies) return next(); 
    var cookies = req.headers.cookie; 

    req.secret = secret; 
    req.cookies = {}; 
    req.signedCookies = {}; 

    if (cookies) { 
     try { 
     req.cookies = cookie.parse(cookies); 
     if (secret) { 
      req.signedCookies = utils.parseSignedCookies(req.cookies, secret); 
      req.signedCookies = utils.parseJSONCookies(req.signedCookies); 
     } 
     req.cookies = utils.parseJSONCookies(req.cookies); 
     } catch (err) { 
     err.status = 400; 
     return next(err); 
     } 
    } 
    next(); 
    }; 
}; 

요청 개체이고 파서는 headers.cookie 속성을 읽습니다. 그런 다음 쿠키가 파싱되어 req.signedCookies에 저장됩니다. handshakereq으로 전달 했으므로 이제 쿠키는 handshake.signedCookies입니다. 쿠키는 secret을 파서에 전달했기 때문에 쿠키에만 서명됩니다.

+0

이 답변 주셔서 감사합니다,이 방법은 그것을 할 수 더 의미하지만 불행히도 그것은 작동하지 않습니다 중 몇 가지 이유. 다음은 서명 된 값과 다시 서명 된 값의 스크린 샷입니다. 여전히 다릅니다 : http://grab.by/qyra 다른 것을 어떻게해야할지 모르겠습니다 ... –

+0

코드에서 쿠키 파서를 어떻게 사용하고 있습니까? ? – hexacyanide

+0

코드는 파싱 부분의 코드와 거의 같습니다. 하지만 중간에 올바르게 추가하면 확실하지 않습니다. 그것은 세션 미들웨어 이전과 라우터 미들웨어 이전에 발생합니다. 나는 집에 도착했을 때 나중에 전체 코드를 게시하려고합니다. 어쩌면 아이디어가있을 것입니다 .. –

0

쿠키/세션/socket.io 등으로 왼쪽과 오른쪽에 문제가있었습니다. 마침내 도움이 된 @vytautas 설명이었습니다. 누구나이 문제가 발생하면 localhost 또는 IP 주소로 설정했는지 또는 무엇을 가지고 있는지에 관계없이 올바른 호스트에 연결하고 있는지 확인하십시오. 그렇지 않으면 들어오는 쿠키를 구문 분석 할 수 없습니다.

이 (가늠자에 가지 분명한 것 같다.)

관련 문제