Javascript 连接签名cookie解析falsy
我在尝试解析express/connect应用程序中的签名cookie时遇到问题Javascript 连接签名cookie解析falsy,javascript,node.js,express,socket.io,connect,Javascript,Node.js,Express,Socket.io,Connect,我在尝试解析express/connect应用程序中的签名cookie时遇到问题 io.set('authorization', function (handshakeData, callback) { if(handshakeData.headers.cookie) { var signedCookies = cookie.parse(decodeURIComponent(handshakeData.headers.cookie)); handshake
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
返回空对象。我查看了parse函数的源代码,发现它调用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
})
}));
请帮我指出我做错了什么。谢谢cookie解析器是一个中间件,所以我们必须像中间件一样使用它。它将实际填充您传递给它的对象。这是您希望使用解析器的方式:
// 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);
});
cookie解析器API已更改,现在看起来是这样的:
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();
};
};
所以我们要做的是将
handshake
作为请求对象传递,解析器将读取headers.cookie
属性。然后,cookies将被解析,并放入req.signedCookies
。由于我们将handshake
作为req
传递,cookies现在处于handshake.signedCookies
中。请注意,Cookie仅被签名,因为您将一个秘密
传递给了解析器。我在Cookie/sessions/socket.io等方面遇到了左右两方面的问题。最后是@vytautas注释帮助了我。如果有人看到这一点,请确保您连接到了正确的主机,无论您是否将其设置为本地主机或IP地址,或者您拥有什么。否则,您将无法解析传入的Cookie
(事后看来似乎有点明显。)谢谢你的回答,这样做更有意义,但不幸的是,出于某些原因,它也不起作用。这里是签名和重新签名值的屏幕截图-它仍然不同:我真的不知道还要做什么…解析部分的代码与您的代码几乎相同。但我不确定我是否正确地将其添加为中间件。它先于会话中间件和路由器中间件。等我回家后,我会把所有的代码都发出去,也许会有什么想法……该死的,似乎一切都很好。问题是,在打开浏览器时,我在连接到socketio服务器时使用了IP地址。这导致在发送套接字握手请求时向服务器发送错误的cookie。。。愚蠢的我。。