好的,所以我对 Node.js 比较陌生。
我正在尝试让会话正常工作并可以在我的 socket.io 方法中访问。
我在这里找到了这个精彩的教程和一些额外的代码:
http://www.danielbaulig.de/socket-ioexpress/
http://howtonode.org/socket-io-auth/server.js
我最终得到了您在下面看到的代码。现在奇怪的部分是它今天一整天都工作得很好......我正在做一些简单的 Jade 和 CSS 工作,它停止在标题中传递 cookie(换句话说,它永远不会通过第一个 if 语句)。
我正在使用一个一直像冠军一样工作的 redis 商店。
我四处阅读,有些人说使用 IP 而不是 localhost(即:无法从带有 Socket.IO 的 cookie 中获取 Express 会话 ID),但这似乎对我没有多大帮助。
我试过弄乱我正在使用的端口......那没有做任何事情。
在代码下方,我放入了 handshakeData.headers 对象的转储中……不知道我在看什么。
io.set('authorization', function (handshakeData, accept) {
if (handshakeData.headers.cookie) {
handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);
handshakeData.sessionID = connect.utils.parseSignedCookie(handshakeData.cookie['express.sid'], 'big pixel is awesome');
handshakeData.sessionStore = sessionStore;
sessionStore.get(handshakeData.sessionID, function (err, session) {
if (err || !session) {
// if we cannot grab a session, turn down the connection
accept('Error', false);
}
else {
// save the session data and accept the connection
handshakeData.session = new Session(handshakeData, session);
accept(null, true);
}
});
}
else {
console.log('BAD - No cookie for you.')
return accept('No cookie transmitted.', false);
}
accept(null, true);
});
标题转储
{ headers:
{ host: '127.0.0.1:65258',
connection: 'keep-alive',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
origin: 'http://localhost:65258',
accept: '*/*',
referer: 'http://localhost:65258/',
'accept-encoding': 'gzip,deflate,sdch',
'accept-language': 'en-US,en;q=0.8' },
address: { address: '127.0.0.1', port: 65333 },
time: 'Sun Nov 10 2013 23:28:09 GMT-0500 (EST)',
query: { t: '1384144089105' },
url: '/socket.io/1/?t=1384144089105',
xdomain: true,
secure: undefined,
issued: 1384144089109 }
有什么想法吗?
更新 好的,所以我又玩了一些,并将其从安全 cookie 更改为不安全的 cookie ......就像这样:
// Configuration
app.configure(function () {
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.static(__dirname + '/public'));
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({
secret: "SECRET!!",
store: redisStore,
key: 'express.sid',
cookie: { secure: false, maxAge:86400000 } // <-- I changed this from true to false
}));
app.use(app.router);
});
这似乎已经解决了它,但我仍然不明白为什么这会改变是否首先发送 cookie ......