如何使用Connect的cookieSession解码cookie秘密?

时间:2012-07-29 14:26:06

标签: javascript node.js express connect

我正在使用Connect的cookieSession()设置Cookie。这似乎加密了cookie的秘密值,返回类似'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();
});

1 个答案:

答案 0 :(得分:4)

嗯......你似乎对使用cookie会话感到有些困惑。

  1. 您的/setcookie路径未设置任何Cookie /会话值。要使用Cookie会话,您需要在req.session上设置一些值,例如req.session.message = "Hi there!"这些值现在存储在Cookie中。

  2. 您只能在一次回调中res.app.use(),请求会话在其他任何地方都无法正常工作。要在另一个请求中读取这些cookie,请将app.use(express.cookieSession({ key: "test", secret: "test" }));放在应用程序级别。

  3. 编辑:其实我已经考虑过你的res.app.use()调用,它可能会通过向你的应用添加越来越多的中间件层(cookieSession)来破坏你的app /导致内存泄漏,每次有人请求/setcookie。如果您只想在特定请求中添加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对象上设置任何内容。 :)