fix: CSRF 403 — читать токен из body (_csrf), cookieName без __Host- (v0.4.0)

This commit is contained in:
2026-05-30 16:49:35 +03:00
parent 0845440f86
commit 093b96b9ae
2 changed files with 11 additions and 1 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ipwhitelist", "name": "ipwhitelist",
"version": "0.3.0", "version": "0.4.0",
"description": "IP WhiteList microservice for cloud provider", "description": "IP WhiteList microservice for cloud provider",
"main": "server.js", "main": "server.js",
"scripts": { "scripts": {
+10
View File
@@ -42,6 +42,16 @@ function initCsrf() {
// Если сессии нет — пустая строка (допустимо для /login до установки сессии). // Если сессии нет — пустая строка (допустимо для /login до установки сессии).
getSessionIdentifier: (req) => req.sessionID || '', getSessionIdentifier: (req) => req.sessionID || '',
// ⚠️ csrf-csrf v4 по умолчанию читает токен из заголовка x-csrf-token.
// Наши формы (EJS) отправляют его в теле POST как поле _csrf.
// Без этой строки токен не находится → 403 на каждый POST.
getCsrfTokenFromRequest: (req) => req.body && req.body._csrf,
// Имя cookie без префикса __Host- (дефолт __Host-psifi.x-csrf-token
// требует Secure-флаг; при NODE_ENV≠production secure:false → cookie
// отклоняется браузером по HTTPS и валидация падает).
cookieName: 'csrf-token',
cookieOptions: { cookieOptions: {
// secure: true → cookie передаётся только по HTTPS. Важно в продакшене. // secure: true → cookie передаётся только по HTTPS. Важно в продакшене.
secure: process.env.NODE_ENV === 'production', secure: process.env.NODE_ENV === 'production',