Вопрос по express, node.js – Добавление значения cookie в Socket.IO

7

Как добавить значение cookie на Socket.IO?

io.sockets.on('connection', function (client)
{ 
    console.log(client.id); 
    client.handshake.headers.cookie.socketID = client.id;   // not work
 // client.handshake.headers.cookie("socketID",client.id);  //crash

    console.log(client.handshake.headers.cookie);
// The current output is:
//connect.sid=tI21xumy3u2n4QXO1GljmPAf.pzFQ1Xu%2B6bz36secu4VSCdSNU8PT1L44gQZ4kFUFQqQ
//this is express session id, and I also want to add client.id of Socket.IO. 

//...........
}

я прочитал http://www.danielbaulig.de/socket-ioexpress/ , но мне не нужно управление сессиями для node.js, а просто нужно добавить значение идентификатора клиента socket.io в cookie, как это делает connect.sid.

stackoverflow.com/questions/4754232/… gilbert

Ваш Ответ

2   ответа
-2

я попробовал всевозможные способы установить cookie в ответ на запрос получения рукопожатия, но безуспешно. Однако мне удалось заставить его работать, настроив сам прототип кода socket.io.

В socket.io версии 1.3.4,

в \ node_modules \ socket.io \ node_modules \ engine.io \ lib \ server.js

изменить строку 249 с:

headers['Set-Cookie'] = self.cookie + '=' + id;

в

headers['Set-Cookie'] = req.headers.cookie;

все куки в запросе будут возвращены в ответе

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceedednpm install.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
11

авторизация с Socket.io. Это где он обрабатывает первоначальный запрос на подключение, и где вы можете установить заголовок ответа.

Я не уверен, чтоcookie(name,value) сокращение работает, хотя вы можете попробовать установить его вручную:

    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000)); // set day value to expiry
    var expires = "; expires="+date.toGMTString();

    handshake.headers.cookie = name+"="+value+expires+"; path=/";
Я предложил использовать авторизацию для сохранения специфичных для клиента данных в качестве любых изменений, которые вы вносите вhandshake.headers по авторизации доступны вclient.handshake в вашем основном приложении, как вы предлагаете выше. Без дополнительной информации по вашему варианту использования трудно получить более конкретную информацию.
Как вы и предполагали, я обнаружил, что этот тип файлов cookie необходимо добавлять со стороны клиента, и теперь он работает. Благодарю. Добавьте это и на страницу вопроса выше. Еще раз большое спасибо! Ken OKABE
Спасибо тебе, Уэс. Я лучше понимаю авторизацию с Socket.io. Однако меня беспокоит то, что, поскольку блок находится за пределами «io.sockets.on (« connection », function (client) {......})», он, похоже, не сможет справиться с client.id, который я хочу включить в cookie. Любое предложение по этому поводу? Ken OKABE
Я бы справился с вещами на стороне клиента. То есть: отправить событие клиенту с идентификатором сокета в качестве данных и сохранить код клиента в файле cookie. Затем вы можете прочитать куки-файл запроса в блоке авторизации на стороне сервера черезhandshake.headers.cookie, Я не уверен, почему вы хотели бы сделать это, поскольку socket.id не должен сохраняться между сеансами. При отключении это не имеет значения.
@ C4u этот ответ был 5 лет назад, я полагаю, Socket.io изменил обратный вызов авторизации, чтобы отброситьhandshake двигательный Увидетьthe docs, В любом случае вы должны использовать браузер Network devtools, чтобы проверить начальные заголовки запроса / ответа сокета, чтобы увидеть, что происходит с вашими файлами cookie.

Похожие вопросы