Как сеансы работают в Express.js с Node.js? - PullRequest
90 голосов
/ 02 апреля 2011

Используя Express.js , сессии очень просты. Мне любопытно, как они на самом деле работают.

Хранит ли он куки на клиенте? Если так, где я могу найти это печенье? Если требуется, как мне его декодировать?

Я хочу, чтобы я мог видеть, вошел ли пользователь в систему, даже если пользователь в данный момент не находится на сайте (например, как Facebook знает, что вы вошли в систему, когда находитесь на других сайтах). Но я полагаю, что понимаю, что должен сначала понять, как работают сессии.

Ответы [ 3 ]

153 голосов
/ 20 июля 2012

Обзор

Express.js использует cookie-файл для хранения идентификатора сеанса (с подписью шифрования) в браузере пользователя, а затем при последующих запросах использует значение этого cookie-файла для получения информации о сеансе, сохраненной всервер.Это серверное хранилище может быть хранилищем памяти (по умолчанию) или любым другим хранилищем, которое реализует требуемые методы (например, connect-redis ).

Подробно

Express.js/ Connect создает 24-символьную строку Base64 , используя utils.uid(24), и сохраняет ее в req.sessionID.Затем эта строка используется в качестве значения в файле cookie.

Клиентская сторона

Подписанные файлы cookie всегда используются для сеансов, поэтому значение файла cookie будет иметь следующий формат.

[sid].[signature]

Где [sid] - идентификатор сессии, а [подпись] создается подписанием [sid] с использованием секретного ключа, предоставленного при инициализации промежуточного программного обеспечения сеанса.Шаг подписания делается для предотвращения взлома.В вычислительном отношении должно быть невозможно модифицировать [sid], а затем воссоздать [signature] без знания используемого секретного ключа.Сеансовый 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.

37 голосов
/ 02 апреля 2011

Я никогда не использовал Express.js, хотя согласно их документации по теме это звучит так:

  • Файлы cookie хранятся на клиенте, сключ (который сервер будет использовать для получения данных сеанса) и хеш (который сервер будет использовать, чтобы убедиться, что данные cookie не были подделаны, поэтому, если вы попытаетесь изменить значение, cookie будет недействительным)

  • Данные сеанса, в отличие от некоторых платформ (например, Play Framework !), Хранятся на сервере, поэтому файл cookie больше похож на заполнитель для сеанса, чемдержатель фактических данных сеанса.

  • С здесь , похоже, что данные этого сеанса на сервере по умолчанию хранятся в памяти, хотя их можно изменить налюбая форма хранения реализует соответствующий API.

Поэтому, если вы хотите проверить вещи без определенного req объекта запроса, как вы сказали, вам нужно просто получить доступ к тому же хранилищу.В нижней части первой страницы документации описываются необходимые методы, которые необходимо реализовать хранилищу, поэтому, если вы знакомы с вашим API хранилища, возможно, вы могли бы выполнить .getAll(), если что-то подобное существует, и выполнить цикл по данным сеанса.и читать любые значения, которые вы хотите.

8 голосов
/ 02 апреля 2011

Мне любопытно, как они на самом деле работают.

Попробуйте посмотреть этот ответ и wiki материал.

Хранит ли он какие-либо куки на клиенте?

Да, обычно это файл cookie с назначенным идентификатором сеанса, который должен быть подписан секретом во избежание подделки.

Если так, где я могу найти это печенье? Если требуется, как мне его декодировать?

Вы не должны связываться с файлом cookie сеанса на стороне клиента. Если вы хотите работать с сеансами на стороне сервера, вы должны проверить связанные express.js и connect docs.

...