我正在使用Connect的cookieSession()
设置cookie。这似乎加密了cookie的 secret 值,返回的内容类似于's:j:{}。8gxCu7lVJHVs1gYRPFDAodK3 + qPihh9G3BcXIIoQBhM'
如何解密Cookie的值?
示例代码:
app.use(express.bodyParser());
app.use(express.cookieParser());
app.get('/setcookie', function(req, res, next){
res.app.use(express.cookieSession({ key: "test", secret: "test" }));
console.log(req.cookies.test);
res.end();
});
app.get('/', function(req, res, next){
console.log(req.cookies.test);
res.end();
});
最佳答案
嗯...您似乎对cookie session 的使用有点困惑。
/setcookie
路径未设置任何cookie/ session 值。要使用cookie session ,您需要在req.session
上设置一些值,例如req.session.message = "Hi there!"
这些值现在存储在cookie中。 res.app.use()
,否则请求 session 将无法在其他任何地方工作。要在另一个请求中读取这些cookie,请将app.use(express.cookieSession({ key: "test", secret: "test" }));
放在应用程序级别。 编辑:实际上,我已经考虑过您的res.app.use()调用,每次有人请求
/setcookie
时,通过向您的应用程序添加越来越多的中间件层(cookieSession),它可能会破坏您的应用程序/导致内存泄漏。如果您只想在特定请求中添加cookieSession中间件,则需要执行以下操作:yourParser = express.cookieSession({ key: "test", secret: "test" });
app.get('/', yourParser, ...);
app.get('/setcookie', yourParser, ...);
解决方案
这是实际的固定来源:
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.cookieSession({ key: "test", secret: "test" }));
app.get('/setcookie', function(req, res, next){
req.session.message = "Hellau there";
res.end();
});
现在要检查这些值,请在
app.get('/',...)
中尝试以下操作:app.get('/', function(req, res, next){
console.log(req.session); //Yay, this will be available in all requests!
res.end();
});
调试
并回答如何手动解码Cookie中存储的内容的问题,请查看
connect/lib/middleware/cookieSession.js
:// cookieParser secret
if (!options.secret && req.secret) {
req.session = req.signedCookies[key] || {};
} else {
// TODO: refactor
var rawCookie = req.cookies[key];
if (rawCookie) {
var unsigned = utils.parseSignedCookie(rawCookie, secret);
if (unsigned) {
var originalHash = crc16(unsigned);
req.session = utils.parseJSONCookie(unsigned) || {};
}
}
}
它需要
req.cookies[key]
(基本上是您已经在做的事情(req.cookies.test
)),将其弹出到utils.parseSignedCookie
中,然后将其弹出到utils.parseJSONCookie
中。我将原始Cookie字符串放在最后的utils.js文件中:
var signed = exports.parseSignedCookie(
's:j:{}.8gxCu7lVJHVs1gYRPFDAodK3+qPihh9G3BcXIIoQBhM'
, 'test');
var parsed = exports.parseJSONCookie(signed);
console.log(parsed);
并运行它。猜猜我得到了什么:
{}
为什么?因为您从未在
req.session
对象上设置任何东西。 :)