当来自用户的新WebSocket连接进入时,我正在尝试从express-session中获取sessionID。我能够找到sessionID,我只是有一个关于其格式的问题。
当我对Messenger页面进行HTTP请求时,说我将'X'作为sessionID,如果我随后建立了WebSocket连接,则可以找到会话ID'AXB',会话ID X也在那里。包含其他信息。
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var session = require('express-session');
var io = require('socket.io')(server);
var store = new MemoryStore({
checkPeriod: 86400000
});
app.use(session({
store: store,
secret: 'jpcs-0001080900DRXPXL',
saveUninitialized: false,
resave: true
}));
// ...
app.get('/messenger/:uid', authorizationRedirect, (req, res) => {
console.log(req.sessionID);
// prints "EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU"
// ...
});
io.set('authorization', (data, accept) => {
if (data && data.headers && data.headers.cookie) {
console.log(data.headers.cookie);
cookies_str = data.headers.cookie;
cookies_arr = cookies_str.split(';');
cookies = {};
for (index in cookies_arr) {
cookie = cookies_arr[index].split('=');
key = cookie[0].replace(/ /g,'');
val = cookie[1];
cookies[key] = val;
}
sessionId = cookies['connect.sid'].split('.')[0];
console.log(sessionId);
// prints "s%3AEIVUudPTckmojrkv6FN9Cdb5NAQq5oQU.AQkvP..."
// ...
});
所以基本上,在io.set('authorization', ...)
中我得到了:
s%3A EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU
。AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg
但是在app.get('/...', ...)
中,我得到了:
EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU
您会注意到socket.io中的字符串确实包含以下格式的会话ID:"s%3A" + sessionID + ".xxxxxxxxxxx..."
显然,我可以从这里获取sessionID,但是我很好奇为什么当我获得套接字连接时,sessionID像这样显示?不管浏览器,WebSocket实现如何,总是会这样显示吗?包含的其他信息是什么意思?我最想确保这是获取sessionID的可靠方法。谢谢!
答案 0 :(得分:0)
我首先要澄清io.set('authorization',...)
已被弃用。这是更新的版本Documentation
显然,我可以从这里获取sessionID,但是我很好奇为什么当我获得套接字连接时,sessionID像这样显示?不管浏览器,WebSocket实现如何,总是会这样显示吗?
它根本不保留用于套接字连接。这就是在浏览器上固定它的方式。所以是的,它总是那样显示。
包含的其他信息是什么意思?我最想确保这是获取sessionID的可靠方法。 (s%3AEIVUudPTckmojrkv6FN9Cdb5NAQq5oQU.AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg)
仅对前三个字符进行编码,我相信每个sessionID都包含该字符。 DecodedURIComponent("s%3A") = "s:"
之后是sessionID本身(EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU
)
现在,在点(AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg
)之后是签名部分。验证cookie的真实性,并在您签名cookie时给出。是的,我会说这是一种值得信赖且可靠的方式。