diff --git a/package.json b/package.json index 3d64361..d6d3c89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.3.0", + "version": "0.4.0", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/src/middleware/csrf.js b/src/middleware/csrf.js index 2da34d5..b4fbcbd 100644 --- a/src/middleware/csrf.js +++ b/src/middleware/csrf.js @@ -42,6 +42,16 @@ function initCsrf() { // Если сессии нет — пустая строка (допустимо для /login до установки сессии). 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: { // secure: true → cookie передаётся только по HTTPS. Важно в продакшене. secure: process.env.NODE_ENV === 'production',