Node.js условно использует csurf с экспрессом 4

Я пытаюсь использовать csurf всего на нескольких маршрутах в своем экспресс-приложении. это подход:

var express       = require('express');
var session       = require('express-session');
var csrf          = require('csurf');

// some more stuff

var csrfExclusion = ['/myApi','/unsecure'];

var app   = express();

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf();
  }
});

app.use(conditionalCSRF);

даже пробовал:

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf(req, res, next);
    next();
  }
});

и

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf();
    next();
  }
});

Но это дает мне ошибку: объект # не имеет метода 'csrfToken'

Как я могу использовать csurf условно. Документация дает только информацию для использования на всех маршрутах в экспресс-приложении с

app.use(csrf());

Но я не этого хочу, я хочу исключить какой-то маршрут...

любезно... Мартин

ОБНОВЛЕНИЕ:

наконец это работает. Я сделал следующее:

app.use(function(req, res, next){
  if (csrfExclusion.indexOf(req.path) !== -1) {
  next();
}
  else {
  csrf()(req, res, next);
});

Это условно добавляет промежуточное ПО csrf. Но я действительно думаю, что это немного странно называть это так:

csrf()(req, res, next);

Я даже синтаксиса не понимаю...


person marschro    schedule 28.07.2014    source источник
comment
Спасибо, что поделились своими выводами, вы могли бы также написать отдельный ответ для этого. В любом случае, я хотел бы поделиться тем, что в настоящее время есть случаи, когда освобождение от csrf кажется невозможным. Открытая проблема: github.com/expressjs/csurf/issues/10#issuecomment-232501314   -  person Wtower    schedule 14.07.2016


Ответы (2)


В соответствии с этим вам необходимо разделить его на два маршрутизатора, один из которых использует csurf, а другой нет. . Затем вы примените промежуточное ПО к маршрутизатору, а не к приложению.

var routes = express.Router();
var csrfExcludedRoutes = express.Router();

routes.use(csrf());

routes.get('/', function(req, res) {
    //has req.csrfToken()
});

csrfExcludedRoutes.get('/myApi', function(req, res) {
    //doesn't have req.csrfToken()
});
person Ben Fortune    schedule 28.07.2014
comment
спасибо за ссылку... это тоже может сработать... Сейчас я использую описанное решение... - person marschro; 28.07.2014
comment
Я не мог заставить это предлагаемое решение работать, но то, что описано в оригинальном постере в его обновлении, помогло. - person napu; 09.01.2015

Это старая ветка, но я наткнулся на нее и подумал, что попытаюсь ответить на вопрос, который @marshro поднимает о странности вызова csrf()(req, res, next) в промежуточном программном обеспечении.

Здесь происходит то, что csurf возвращает функцию из инструкции require, которая сама используется для создания промежуточной функции с некоторыми необязательными параметрами конфигурации.

Вызов csrf(), используемый в промежуточном программном обеспечении выше, создает функцию промежуточного программного обеспечения с параметрами по умолчанию для КАЖДОГО входящего запроса, требующего защиты csrf. Если вы действительно хотите использовать этот подход, у вас ДЕЙСТВИТЕЛЬНО есть возможность внести простое изменение, чтобы сделать ваше решение более эффективным, очень небольшую реструктуризацию для создания промежуточного программного обеспечения один раз:

// 1. Build the csrf middleware function 'csrfMw' once.
var csrfMw = csrf();          

app.use(function(req, res, next){
    if (csrfExclusion.indexOf(req.path) !== -1) {
        next();
    } else {
        // 2. Use the middleware function across all requests.
        csrfMw(req, res, next);  
    }
);

Тем не менее, когда у вас есть возможность, вы, возможно, захотите снова проверить документы - есть два метода, рекомендуемых для того, чтобы избежать этого подхода. Первый устанавливает промежуточное ПО csrfProtection и применяет его для выбора маршрутов. Второй настраивает два маршрутизатора, как упоминалось выше @ben-fortune: один применяет csrf ко всему, а другой нет. Оба были бы более эффективными, чем условие исключения.

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

person darrin    schedule 08.04.2016