Не мога да накарам 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 вече не е необходимо да се използва междинният софтуер за анализатор на бисквитки, за да работи този модул.

Но що се отнася до мен, трябва да съхраня някакъв постоянен идентификатор на потребителите (по-дълъг от сесията). Трябва да използвам бисквитки за това, нали?

Бих искал да разбера по-добре цялата работа със сесията/бисквитките, но досега не намерих никакъв полезен ресурс по темата.

Благодаря!


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 прокси и докерът не би трябвало да е проблем тук. Чувството ми е, че това е свързано с бисквитката, която е защитена+използвана в сесия ... - person Augustin Riedinger; 09.10.2017