Используя cookieParser() и cookieSession () вместе?

cookieParser() дает нам возможность подписывать куки с секретным предложением, которое отлично подходит для предотвращения подделки. Я понимаю, что cookie подписан со специальным значением, чтобы предотвратить подделку.

Я только что обнаружил cookieSession (), который я считаю большой альтернатива хранящимся на сервере cookies (я храню только { loggedIn = true, userId=763487246824632}, Он никогда не растет).

но... Я обнаружил, что установка "секрета" для cookieParser () ломает вещи, и cookieSession () перестает работать если секретное предложение соответствует. Причина, по-видимому, в том, что если cookie подписан с использованием того же секрета, то cookieParser() фактически берет его и анализирует. Странно то, что однажды cookieParser () сделал свою работу, и С тем же секретом подписи сеанс установлено:

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }

вместо:

{ testing: 'OOO' }

(каждая перезагрузка добавляет "o") Так...

  • мой анализ сделал это правильно?
  • вы знайте, почему сеанс установлен на этот странный { cookie возражать, если секретные предложения совпадают?

Merc.

1 ответов


ваш анализ верен, я могу воспроизвести его.

проблема вызвана эта строка на cookieSession промежуточное ПО (некоторый контекст:options.secret ключ передан в cookieSession, req.secret ключ передан в cookieParser): если вы передадите оба промежуточных по секретный ключ,cookieSession предполагает, что он найдет raw (unparsed) cookie в req.cookies.

но поскольку cookieParser также взял подписанный cookie (и он запускается до cookieSession), то есть парсится сам файл cookie (и поскольку ключи подписи были одинаковыми, ему удалось это сделать), сохранил его в req.signedCookies и исключить его из req.cookies. Так как cookieSession обеспокоен, cookie просто не установлен.

объект, который вы видите, является содержимым сеанса по умолчанию (который является cookie собственность от cookieSession конфигурации):

app.use(express.cookieSession({
  cookie : { // <-- this object
    ...
  }
});

что касается решения: либо используйте другой ключ для каждого промежуточного ПО, либо просто передайте один из них свой секретный ключ, но не оба (с пониманием того, что если вы передадите его cookieParser, все ваши cookies будут подписаны).

FWIW: я не совсем уверен, что это настоящая ошибка. Это следствие использования одного и того же механизма подписи для обоих cookieParser и cookieSession, без различия между куки-файлами, подписанными одним или другим. Хотя это может быть исправлено, всегда проверяя, находится ли cookie в req.signedCookies.