Используя 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
.