Как сеансы работают в Express.js с Node.js?
Используя Express.js, сеансы просты. Мне любопытно, как они на самом деле работают.
Сохраняет ли файл cookie на клиенте? Если да, где я могу найти этот файл cookie? Если необходимо, как его декодировать?
В основном я хочу видеть, вошел ли пользователь в систему, даже когда пользователь на самом деле не находится на сайте (например, как известно, что вы вошли в систему, когда находитесь на других сайтах). Но я полагаю, что понимаю, что я должен сначала понять, как работают сеансы.
Ответы
Ответ 1
Я никогда не использовал Express.js, хотя, согласно их документации по теме, это звучит так:
-
Файлы cookie хранятся на клиенте с ключом (который будет использоваться сервером для извлечения данных сеанса) и хешем (который сервер будет использовать, чтобы убедиться, что данные cookie не были подделаны, поэтому, если вы попытаетесь изменить значение, cookie будет недействительным)
-
Данные сеанса, в отличие от некоторых фреймворков (например, Play Framework!), хранятся на сервере, поэтому файл cookie больше похоже на местозаполнитель сессии, чем владелец фактических данных сеанса.
-
Из здесь, похоже, что данные сеанса на сервере по умолчанию хранятся в памяти, хотя это может быть изменено на любая форма хранения реализует соответствующий API.
Итак, если вы хотите проверять вещи без определенного объекта запроса req
, как вы сказали, вам нужно просто получить доступ к тому же хранилищу. В нижней части первой страницы документации содержатся подробные сведения о необходимых методах, которые необходимо реализовать хранилищу, поэтому, если вы знакомы с вашим API-интерфейсом хранения, возможно, вы можете выполнить .getAll()
, если что-то подобное существует, и просмотреть данные сеанса и читать любые значения, которые вы хотите.
Ответ 2
Обзор
Express.js использует файл cookie для хранения идентификатора сеанса (с сигнатурой шифрования) в пользовательском браузере, а затем в последующих запросах использует значение этого файла cookie для получения информации о сеансе, хранящейся на сервере. Это хранилище на стороне сервера может быть хранилищем памяти (по умолчанию) или любым другим хранилищем, которое реализует необходимые методы (например, connect-redis).
Подробнее
Express.js/Connect создает 24-символьную строку Base64 с помощью utils.uid(24)
и сохраняет ее в req.sessionID
. Эта строка затем используется как значение в файле cookie.
Клиентская сторона
Подписанные файлы cookie всегда используются для сеансов, поэтому значение cookie будет иметь следующий формат.
[sid].[signature]
Где [sid] is sessionID и [подпись] генерируется путем подписания [sid] с использованием секретного ключа, предоставленного при инициализации промежуточного программного обеспечения сеанса.
Шаг подписания делается для предотвращения несанкционированного доступа. Это должно быть сложно вычислить, чтобы изменить [sid], а затем воссоздать [подпись] без знания секретного ключа. Файл cookie сеанса по-прежнему уязвим для краж и повторного использования, если не требуется модификация [sid].
Имя этого файла cookie
connect.sid
Сторона сервера
Если обработчик происходит после промежуточного программного обеспечения cookieParser
и session
, он будет иметь доступ к переменной req.cookies
. Это содержит объект JSON, ключи которого являются ключами cookie, а значениями являются значения cookie. Он будет содержать ключ с именем connect.sid
, и его значение будет подписанным идентификатором сеанса.
Вот пример того, как настроить маршрут, который будет проверять наличие cookie сеанса на каждом запросе и печатать его значение на консоли.
app.get("/*", function(req, res, next) {
if(typeof req.cookies['connect.sid'] !== 'undefined') {
console.log(req.cookies['connect.sid']);
}
next(); // Call the next middleware
});
Вам также необходимо убедиться, что маршрутизатор (app.use(app.router)
) включен после cookieParser
и session
в разделе конфигурации.
Ниже приведен пример данных, хранящихся внутри Express.js/Connect.
{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}
Поле user
является обычным. Все остальное является частью управления сеансом.
Пример из Express 2.5.
Ответ 3
Мне любопытно, как они на самом деле работают.
Попробуйте найти этот ответ и wiki.
Сохраняет ли файл cookie на клиенте?
Да, это обычно файл cookie с назначенным идентификатором сеанса, который должен быть подписан с тайной, чтобы предотвратить подделку.
Если да, где я могу найти этот файл cookie? Если необходимо, как его декодировать?
Вам не следует связываться с файлом cookie сеанса на стороне клиента. Если вы хотите работать с сеансами на стороне сервера, вы должны проверить связанные express.js и connect docs.