Используйте connect-redis и сделайте redis хранилищем сеансов для всех аутентифицированных пользователей. Убедитесь, что при аутентификации вы отправляете ключ (обычно req.sessionID) клиенту. Попросите клиента сохранить этот ключ в файле cookie.
При подключении к сокету (или в любое время позже) извлеките этот ключ из файла cookie и отправьте его обратно на сервер. Получите информацию о сеансе в Redis с помощью этого ключа. (Получить ключ)
Например:
Сторона сервера (с Redis в качестве хранилища сеансов):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Сторона клиента:
//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();
socket.on('connect', function() {
var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
socket.send({rediskey: rediskey});
});
Сторона сервера:
//in io.on('connection')
io.on('connection', function(client) {
client.on('message', function(message) {
if(message.rediskey) {
//fetch session info from redis
redisclient.get(message.rediskey, function(e, c) {
client.user_logged_in = c.username;
});
}
});
});
GetCookie
это функция javascript.Мне также понравилось, как pusherapp делает частные каналы .
Потому что также
socket.io
есть уникальный socket_id для каждого сокета.Они использовали подписанные строки авторизации для авторизации пользователей.
Я еще не отразил это
socket.io
, но думаю, что это может быть довольно интересная концепция.источник
Я знаю, что это немного устарело, но для будущих читателей в дополнение к подходу к синтаксическому анализу cookie и извлечению сеанса из хранилища (например, паспорт.socketio ) вы также можете рассмотреть подход на основе токенов.
В этом примере я использую довольно стандартные веб-токены JSON. Вы должны предоставить клиентской странице токен, в этом примере представьте конечную точку аутентификации, которая возвращает JWT:
Теперь ваш сервер socket.io можно настроить следующим образом:
Промежуточное ПО socket.io-jwt ожидает токен в строке запроса, поэтому от клиента вам нужно только прикрепить его при подключении:
Я написал более подробное объяснение этого метода и файлов cookie здесь .
источник
Вот моя попытка сделать следующее:
Поскольку вы, возможно, захотите добавить несколько запросов API, мы также будем использовать пакет http , чтобы HTTP и веб-сокет работали на одном порте.
server.js
Следующий отрывок включает только все, что вам нужно для настройки предыдущих технологий. Вы можете увидеть полную версию server.js, которую я использовал в одном из своих проектов, здесь .
розетки / index.js
Наш
socketConnectionHandler
, мне просто не нравится помещать все в server.js (хотя вы вполне могли бы это сделать), тем более что этот файл может довольно быстро содержать довольно много кода.Дополнительный материал (клиент):
Просто очень простая версия того, чем может быть клиент JavaScript socket.io:
Ссылки:
Я просто не мог ссылаться внутри кода, поэтому переместил его сюда.
1. Как настроить стратегии для паспортов: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
источник
В этой статье ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) показано, как
Используя этот код, вы также можете получить их в socket.io.
источник
использовать сеанс и redis между c / s
// сторона сервера
источник
это должно сделать это
источник