Поскольку соединение больше не использует метод parseCookie, как мы можем получить данные сеанса с помощью экспресс?

В node.js и express есть много примеров, показывающих, как получить данные сеанса.

Как вы можете видеть, когда вы посещаете третью ссылку, это ссылка на StackOverflow. Был хороший ответ, но, как отмечалось в комментариях от @UpTheCreek, соединение уже не имеет метода parseCookie. Я просто столкнулся с этой проблемой. Все обучающие программы, которые я нашел, используют метод connect parseCookie, который в настоящее время не существует. Поэтому я спросил его, как мы можем получить данные сеанса, и он сказал, что не знает лучшего подхода, поэтому я подумал, что поставил бы здесь вопрос. При использовании [email protected], socket.io и redis, как мы можем получить данные сеанса и использовать это для авторизации пользователя? Я смог использовать require('connect').utils.parseSignedCookie;, но когда я это делаю, я всегда получаю предупреждение/ошибку при рукопожатии,

warn - handshake error Error

и из того, что я прочитал, похоже, что это не постоянное решение.


UPDATE

Хорошо, я получил session.socket.io, работая на моем сервере. И, как я подозревал, я застрял в санкционировании. Я думаю, что, возможно, я ошибаюсь, поэтому не стесняйтесь меня исправлять. В моей базе данных Redis у меня будет информация о пользователе. При первом входе в систему я хочу обновить свой файл cookie, чтобы он содержал их информацию о пользователе. Затем, в следующий раз, когда они вернутся на сайт, я хочу проверить, есть ли у них файл cookie и есть ли информация пользователя. Если его нет, я хочу отправить их на экран входа в систему. На экране входа в систему, когда пользователь отправляет информацию, он будет тестировать эту информацию в базе данных Redis, и если она будет соответствовать, она обновит файл cookie с информацией пользователя. Мои вопросы таковы:

1) Как я могу обновить/изменить файл cookie через RedisStore?

2) Похоже, данные сеанса сохраняются только в файлах cookie. Как я могу отслеживать информацию пользователя со страницы на страницу, если кто-то отключил cookies?

Вот мой применимый код:

//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);

io.configure(function(){
  io.set('authorization', function(handshake, callback){
    if(handshake.headers.cookie){
      //var cookie = parseCookie(handshake.headers.cookie);
      //if(cookie.user){
      //  handshake.user = cookie.user;
      //}
    }
    callback(null, true);
  });
});

ssockets.on('connection', function(err, socket, session){ ... });

Ответ 1

После переключения на session.socket.io какое-то время я столкнулся с несколькими проблемами из-за асинхронного характера модуля при загрузке информации о сеансе. Поэтому я создал собственный модуль под названием session.io. Он используется следующим образом:

var express = require('express');
var app = express();
var server = require('http').createServer(app);

//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  //...truncate...//
  app.use(cookieParser);
  //make sure to use the same secret as you specified in your cookieParser
  app.use(express.session({secret: 'secret', store: sessionStore}));
  app.use(app.router);
});

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});

server.listen(app.get('port'), function(){
  console.log('Listening on port ' + app.get('port'));
});

var io = require('socket.io').listen(server);

io.configure(function(){
  //use session.io to get our session data
  io.set('authorization', require('session.io')(cookieParser, sessionStore));
});

io.on('connection', function(socket){
  //we now have access to our session data like so
  var session = socket.handshake.session;
  console.log(session);
});

Ответ 2

Посмотрите на socket.io wiki. Особенно детали Настройка Socket.IO и Авторизация и подтверждение связи.

Он показывает, как использовать socket.io с RedisStore и предоставляет два разных метода авторизации.

Дополнительная информация о подключении express v3, redis и socket.io

Ответ 3

Ваши вопросы:

  • Как обновить/изменить файл cookie через RedisStore?
  • Похоже, данные сеанса сохраняются только в файлах cookie. Как я могу отслеживать информацию пользователя со страницы на страницу, если кто-то отключил cookies?

Cookies/Sessions/RedisStore Мысли:

  • Как правило, у вас есть ровно один файл cookie, который является идентификатором сеанса
  • Все пользовательские состояния хранятся на сервере в "сеансе", который может быть найден через идентификатор сеанса
  • Вы можете использовать Redis в качестве внутреннего хранилища для ваших данных сеанса.
  • Redis позволит вам сохранить состояние сеанса, даже когда ваш сервер перезагружен (хорошо).
  • Вы можете сохранить гору данных в своей сессии (req.session.key = значение)
  • Все данные, хранящиеся в сеансе, будут сохраняться до тех пор, пока пользователь не выйдет из системы или не истечет срок их действия.

Пример node.js Код:

var app = express.createServer(
  express.static(__dirname + '/public', { maxAge: 31557600000 }),
  express.cookieParser(),
    express.session({ secret: 'secret', store: new RedisStore({
          host: 'myredishost',
          port: 'port',
          pass: 'myredispass',
          db: 'dbname',
      }, cookie: { maxAge: 600000 })})
);

Сессия и мысли куки файлов:

  • Ваш второй вопрос нам о сеансах без куки. Это возможно.
  • Вы, в основном, ставите идентификатор сеанса на URL-адрес каждого запроса, отправляемого на сервер.
  • Я твердо верю, что большинство людей разрешают куки.
  • Если это требование, google: сеанс без файлов cookie

Ответ 4

Данные сеанса доступны с помощью:

req.session