在数据标题中不显示cookieSession密钥
我试图解决在socket.io中访问会话variables的臭名昭着的问题。 我基本上已经阅读过谷歌关于这个话题的每一个链接,而且我还在挣扎。
毕竟我的路由我有这个:
io.set('authorization', function(data,accept) { data.cookie = cookie.parse(data.headers.cookie); ---> console.log(data.cookie); data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret); sessionStore.get(data.sessionID, function (err, session) { console.log(session); }); });
不幸的是,我画了一个箭头的console.log返回:
{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' }
所以当然,我得到一个关于express.sid未定义的错误。 当我更改express.sid connect.sid时,我的会话variables未定义。
我真的很努力地解决这个问题 – 我已经在这里待了几个小时。 任何帮助?
编辑:总结我解决的问题:
- 在app.config中,我使用cookieSession而不是会话
- 我的客户端连接到我的服务器的端口转发的外部ip版本。 这不包含cookie数据。
- .split('。')[0] .substring(2)在查找sessionID时是绝对必要的
- 在io.set('authorization,function(handshake,callback)…必须调用“callback(null,true)”)的结尾,以便socket.io连接正常进行
你很近 在传递给parsing器之前,实际上并不需要修改它。
io.set('authorization', function(handshake, callback) { handshake.cookie = cookie.parse(handshake.headers.cookie); handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret); sessionStore.get(handshake.sessionID, function(err, session) { // the session would be here }); });
但是,由于您可以访问cookieparsing器中间件,所以我个人会这样做:
var parseCookie = express.cookieParser(conf.sessionSecret); io.set('authorization', function(handshake, callback) { if (handshake.headers.cookie) { parseCookie(handshake, null, function(err) { handshake.sessionID = handshake.signedCookies['express.sid']; sessionStore.get(handshake.sessionID, function(err, session) { // the session would be here }); }); } });
这种方法收集在parsingcookie的过程中可能出现的任何错误,并且通过将handshake
对象作为HTTP请求对象进行传递,因为它们都具有headers.cookie
属性。 然后,cookieparsing器将parsingcookie并将其分配给handshake
对象,以便您可以从handshake.signedCookies
find会话ID。