Не удается получить идентификатор Express session из файлов cookie с помощью Socket.IO
У меня есть типичное веб-приложение в Node, которое использует структуру Express и промежуточное ПО сеанса. Я также использую Socket.io для некоторых динамических частей моего приложения (в настоящее время это механизм чата, но тангенциальный). Я смог успешно настроить сеансы и socket.io самостоятельно, но хотел бы объединить их (EG: связать сообщения сокета сокетами с учетными записями пользователей без попадания в базу данных).
Следует отметить (и я вижу, что это возможный вопрос), я запускаю два экспресс-сервера на разных портах: один для обычного HTTP-трафика и один для трафика HTTPS. Тем не менее, у меня есть оба сервера, которые имеют идентичную конфигурацию и используют один и тот же магазин сеансов. Сессии сохраняются для меня между страницами http и https. Сеанс устанавливается первоначально через страницу, обслуживаемую с HTTPS, а на странице socket.io - ванильный HTTP.
Я следую руководству, расположенному здесь, чтобы достичь того, что я ищу, относительно интеграции socket.io и сеансов. Тем не менее, в рамках функции авторизации data.headers.cookie никогда не устанавливается, несмотря на то, что часть моего приложения работает как ожидалось. Что еще более странно, что после установки сеанса, если я делаю console.log(document.cookie)
из браузера, я получаю пустую строку, но когда я просматриваю свои файлы cookie с помощью панели инструментов разработчика Firefox, есть файл cookie SID для выражения как подключения.
Вот соответствующая часть кода сервера:
var config = {
ip : "127.0.0.1",
httpPort : 2031,
httpsPort : 2032
};
var utils = require("./utils"),
express = require('express'),
fs = require('fs'),
parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie,
routes = require('./routes')(config);
var httpsOpts = {
key : fs.readFileSync("cert/server-key.pem").toString(),
cert: fs.readFileSync("cert/server-cert.pem").toString()
};
var app = express.createServer(),
https = express.createServer(httpsOpts),
io = require("socket.io").listen(app, { log: false}),
helpers = require("./helpers.js"),
session = new express.session.MemoryStore(),
sessionConfig = express.session({
store : session,
secret : 'secret',
key : 'express.sid',
cookie : {maxAge : 60 * 60 * 1000}
}); //share this across http and https
configServer(app);
configServer(https);
//get SID for using sessions with sockets
io.set('authorization', function(data, accept){
if(data.headers.cookie){
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie['express.sid'];
} else {
return accept("No cookie transmitted", false);
}
accept(null, true);
});
io.sockets.on('connection', function(socket){
//pull out session information in here
});
function configServer(server) {
server.configure(function(){
server.dynamicHelpers(helpers.dynamicHelpers);
server.helpers(helpers.staticHelpers);
server.set('view options', { layout: false });
server.set('view engine', 'mustache');
server.set('views', __dirname + '/views');
server.register(".mustache", require('stache'));
server.use(express.static(__dirname + '/public'));
server.use(express.bodyParser());
server.use(express.cookieParser());
server.use(sessionConfig);
});
}
И вот соответствующий код на клиенте:
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost!
socket.on('server', function(data){
//socket logic is here
});
}
</script>
UPDATE
Даже после установки cookie вручную (а не только переменной сеанса) в маршруте для страницы, использующей SocketIO, часть cookie запроса все еще отсутствует.
Ответы
Ответ 1
Я никогда бы не подумал об этом, пока не сказал, чтобы посмотреть на инициализацию на стороне клиента. Я изменил адрес с localhost на явный IP (127.0.0.1), и теперь файлы cookie отправляются с заголовком в Socket.IO. Я не уверен, что это очевидно или нет, поскольку я предположил, что localhost в любом случае сопоставляется с 127.0.0.1.