在web页面通过iframe跨域登录访问服务的情况下,是不方便取cookie中的sessionid的,于是想到将sessionid直接放到响应体中,这就需要在node.js中直接获取connect.sid这个cookie值,一开始想当然地以为系统(使用的是passport.js)会在登录认证通过后执行res.cookie('connect.sid', …)进行设置,就想直接从res的Set-Cookie头解析出设置的值,结果发现这个cookie压根不存在,甚至在库代码中搜索cookie都不管用,着实急得人直抓头。最后dump出res后确在req中见到了connect.sid值的影子:req.sessionID,然后在 《Express SessionID differs from SessionID in Cookie》 中找到了从req.sessionID计算出connect.sid的方法:
var signature = require('express/node_modules/cookie-signature'); var connectSid = 's:' + signature.sign(req.sessionID, sessionOptions.secret);
其实,connect.sid这个cookie是在请求到来后在req上设置的(不存在则设置),不管有没有登录都会设置。