2017-02-03 4 views
0

EDIT 5экспресс-сессия не будет устанавливать куки connect.sid

меня назад и передний конец, работающие на LAMP-среде с 192.168.80.213/backend Доступно адрес. Я пытаюсь сделать push-сервер уведомлений, используя nodejs, socket.io и express framework для связи назад и переднего конца.

Мой сервер nodejs прослушивает порт 3000, в то время как мой бэкэнд и интерфейс прослушивают порт 80, используя apache.

Вот мой клиент узел:

<script type="text/javascript" src="socket.io-1.4.5.js"></script> 
<script type="text/javascript"> 
    var socket = io('http://192.168.80.213:3000/'); 
</script> 

Вот мой узел сервера:

const express   = require('express') 
     , app   = express() 
     , http   = require('http').Server(app) 
     , socketIo  = require('socket.io')(http) 
     , cookieParser = require('cookie-parser') 
     , cookie   = require('cookie') 
     , connect  = require('connect') 
     , expressSession = require('express-session') 
     , port   = 3000 
     , helmet   = require('helmet') 
     , name   = 'connect.sid' 
     , sessionStore = new expressSession.MemoryStore({ reapInterval: 60000 * 10 }) 
     , sessionSecret = 'VH6cJa7yZSmkRbmjZW#J3%CDn%dt' 
     , environment = process.env.NODE_ENV || 'development' 
     ; 

/** Configuration **/ 
app.enable('trust proxy'); 
app.disable('x-powered-by'); 
app.use(helmet()); 
app.use(cookieParser()); 
app.use(expressSession({ 
    'name' : name, 
    'secret': sessionSecret, 
    'store' : sessionStore, 
    'resave': true, 
    'saveUninitialized': true 
})); 

app.get('/', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello from node'); 
}); 

socketIo.use(function(socket, callback) { 
    // Read cookies from handshake headers 
    var cookies = cookie.parse(socket.handshake.headers.cookie); 
    // We're now able to retrieve session ID 
    var sessionID; 
    if (cookies[name]) { 
     console.log("cookies['" + name + "'] = " + cookies[name]); 
     sessionID = cookieParser.signedCookie(cookies[name], sessionSecret); 
     console.log("sessionID = " + sessionID); 
    }else{ 
     console.log("cookies['" + name + "'] = undefined"); 
    } 

    if (!sessionID) { 
     console.log('ERROR NO SESSION CONNECTION REFUSED !!'); 
     callback('No session', false); 
    } else { 
     // Store session ID in handshake data, we'll use it later to associate 
     // session with open sockets 
     socket.handshake.sessionID = sessionID; 
     callback(null, true); 
    } 

}); 


socketIo.on('connection', function (socket) { // New client 
    console.log('new connection..'); 
    console.log('user ' + socket.handshake.sessionID + ' authenticated and is now connected.'); 

}); 

/** Start server */ 
http.listen(port); 
console.log("listening on :" + port); 

Перейти к 192.168.80.213:3000 и увидеть 'Привет от узла' и печенье [ 'connect.sid'] является устанавливается в соответствии с скриншоте ниже

connect.sid cookie correctly set

И Консоль вывода:

enter image description here

Теперь Очистка кэша и я иду к моей спине конца приложение, где находится мой nodeClient 192.168.80.213/backend.

connect.sid печенья не существует

enter image description here

И консольный вывод:

enter image description here

Почему экспресс-сеанс не установлен cookie.sid? как я могу это исправить? Я новичок в узле и выражаю, я трачу много раз на поиски в Google без успеха, надеюсь, что некоторые помощники хозяев узла помогут мне!

С уважением

ответ

1

Я не знаю, какую версию socket.io вы используете, но после версии 1.0 (> 1.0):

  • Чтобы зарегистрировать промежуточное программное обеспечение, вы должны использовать socketIo.use (см documentation)
  • Первый параметр - входящий разъем, которые имеют доступ к запросу через socket.request
  • экспресс-сессия от defau л сохранить печенье с connect.sid именем, если вы хотите использовать io имя, которое вы должны установить его явно (см name option)
  • Если вы хотите, чтобы разобрать подписанные кук вы должны предоставить ему sessionSecret не sessionStore
  • и, наконец, я думаю, что рукопожатие поддержки устарел, и вы должны прикрепить все, что хотите, непосредственно к разъему (см. authentication-differences).

С учетом aboves вы можете использовать промежуточное программное обеспечение, как следующее Authenticate ваши розетки:

// every incoming socket should pass this middleware 
socketIo.use(function(socket, next) { 
    var cookies = cookie.parse(socket.request.headers.cookie); 
    var sessionID = cookieParser.signedCookie(cookies['connect.sid'], sessionSecret); 
    sessionStore.get(sessionID, function(err, session) { 
    if (session && session.isAuthenticated) { 
     socket.userId = session.user.id; 
     return next(); 
    } else { 
     return next(new Error('Not Authenticated')); 
    } 
    }); 
}); 
// when connected ... 
socketIo.on('connection', function(socket) { 
    console.log('user ' + socket.userId + ' authenticated and is now connected.') 
}); 

Здесь я считаю вас установить isAuthenticated логическое значение и user на сессии, когда пользователь вошел в

Также. помните, что встроенный в sessionStore, MemoryStore не подходит для производственной среды:

По умолчанию хранилище сеансов на стороне сервера, MemoryStore, намеренно не , предназначенное для производственной среды. Он будет утечки памяти в большинстве случаев условиях, не масштабируется за один процесс и предназначен для отладки и разработки.

Таким образом, вы должны использовать другой сеанс магазин, как:

+0

console.log (файлы cookie ['connect.sid']); output undefined, затем console.log (файлы cookie ['io']); вернуть что-то, почему файлы cookie ['connect.sid'] не определены? – akio

+0

Уайт только этот код трудно узнать, откуда входит этот файл 'io'. Есть ли где-нибудь вы можете установить этот файл cookie? – dNitro

+0

Что вам нужно? Весь мой код на стороне сервера выше, и я уверен, что я не устанавливаю никакого файла cookie в любом месте – akio

1

У меня нет опыта использования печенья или печенья -парсер и вообще новичок к узлу, но у меня была аналогичная система для проверки соединений сокетов путем доступа к переменным сеанса на стороне сервера, если это вообще помогает.

Сохранить детали сеанса внутри переменной

var sessionStorage = expressSession({ 
'secret': sessionSecret, 
'store' : sessionStore, 
'resave': true, 
'saveUninitialized': true 
}); 

пусть socketIo и приложение использовать для хранения

socketIo.use(function (socket, next) { 
    sessionStorage(socket.request, socket.request.res, next); 
}); 
app.use(sessionStorage); 

, а затем внутри на подключения вы можете получить доступ к этим переменные сеанса с помощью:

socket.request.res.session.[variable name] 
+0

Дело в том, что по умолчанию экспресс создает куки-файл с именем' connect.sid'. В моем случае он не делает это – akio

+0

Проверка отладчика "socket.request.session "имеет свойство" id ", обратите внимание на его не" sid ". Это похоже на набор файлов cookie в браузере. – Spencel

+0

не существует свойства id внутри' socket.request.session', но 'socket.request.sessionID 'присутствует, но не соответствует набору cookie в браузере – akio

Смежные вопросы