Поскольку соединение больше не использует метод 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