Как работают сеансы в Express.js с узлом.Джей?


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

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

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

3 84

3 ответа:

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

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

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

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

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

обзор

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

подробности

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

На Стороне Клиента

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

[sid].[signature]

где [sid] - это sessionID, а [signature] создается путем подписания [sid] с использованием секретного ключа, предоставленного при инициализации промежуточного программного обеспечения сеанса. Шаг подписания выполняется для предотвращения подделки. Оно должно быть вычислительно невозможно изменить [sid], а затем воссоздать [подпись] без знания используемого секретного ключа. Файл cookie сеанса по-прежнему уязвим для кражи и повторного использования, если не требуется изменение [sid].

имя этого файла cookie -

connect.sid

На Стороне Сервера

если обработчик происходит после cookieParser и session middleware он будет иметь доступ к переменной req.cookies. Это содержит JSON-объект, ключами которого являются печенье ключи и значения являются значениями 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"
  }
}

The

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

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

Он хранит некоторые куки на клиенте?

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

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

вы не должны возиться с cookie сеанса на стороне клиента. Если вы хотите работать с сеансами на стороне сервера, вы должны проверить related экспресс.js и подключиться документы.