Не могу заставить lusca CSRF работать с https: 403 запрещено

Это сводит меня с ума. Я попытался прочитать исходный код lusca, но мне было трудно его понять.

Я также проверил несколько примеров, но, поскольку каждая конфигурация отличается, и единственным результатом отладки, который у меня есть, являются две строки для сравнения, мне лучше обратиться за помощью!

Вот сторона сервера кода:

app.use([
cookieParser(process.env.SESSION_SECRET),
session({
  resave: false,
  saveUninitialized: true,
  secret: process.env.SESSION_SECRET,
  store: new MongoStore({ url: MONGO_URL, autoReconnect: true }),
  cookie: {
    secure: process.env.NODE_ENV === 'production'
  },
}), lusca({
  csrf: true,
  xframe: 'SAMEORIGIN',
  xssProtection: true,
})]);

А со стороны клиента я отправляю запросы Ajax POST с заголовком x-csrf-token:l0gH3xmssge53E/p2NsJ4dGnHaSLdPeZ+bEWs=:

fetch(url, {
  method: 'POST',
  credentials: 'include',
  headers: {
    'x-csrf-token': CSRF_TOKEN
  }
});

Сумасшедшая вещь, это работает локально, но как только я перехожу https в production, я получаю сообщение об ошибке 403 Forbidden.

Вот версии, которые я использую:

"cookie-parser": "1.4.3",
"express-session": "1.15.3",
"lusca": "1.5.1",

Также я прочитал это из express/session doc:

Примечание. Начиная с версии 1.5.0, промежуточное ПО cookie-parser больше не требуется для работы этого модуля.

Но что касается меня, мне нужно хранить какой-то постоянный идентификатор пользователей (дольше, чем сеанс). Мне нужно использовать файлы cookie для этого, верно?

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

Спасибо!


person Augustin Riedinger    schedule 29.09.2017    source источник


Ответы (1)


Если вы используете свой сервер Node.js за прокси-сервером, вам нужно будет установить trust proxy в true:

var isProductionEnv = process.env.NODE_ENV === 'production';

app.use([
cookieParser(process.env.SESSION_SECRET),
session({
  resave: false,
  saveUninitialized: true,
  secret: process.env.SESSION_SECRET,
  store: new MongoStore({ url: MONGO_URL, autoReconnect: true }),
  proxy: isProductionEnv,
  cookie: {
    secure:isPrudictionEnv,
  },
}), lusca({
  csrf: true,
  xframe: 'SAMEORIGIN',
  xssProtection: true,
})]);


app.set('trust proxy', isProductionEnv);

Ознакомьтесь с этим переполнением стека ответом. Также посетите эту страницу на Express за прокси.

person mkhanoyan    schedule 06.10.2017
comment
Мое приложение размещено в докере, и nginx сначала выполняет маршрутизацию, это то, что следует называть прокси? Во всяком случае, я попробовал trust proxy, и это не сработало. :( Спасибо за помощь! - person Augustin Riedinger; 06.10.2017
comment
Похоже, вам также может понадобиться добавить параметр proxy в параметры промежуточного программного обеспечения сеанса. Я отредактирую ответ, чтобы вы могли посмотреть. - person mkhanoyan; 08.10.2017
comment
Все равно не повезло. Но я не уверен, что это так: Nginx не использует HTTP-проксирование, и докер не должен быть здесь проблемой. Я чувствую, что это связано с тем, что файл cookie является безопасным + используется в сеансе... - person Augustin Riedinger; 09.10.2017