express. js CSURF cook ie и совпадение заголовка, возвращая 403 - PullRequest
1 голос
/ 06 января 2020

У меня есть простая express настройка сервера, например:

  app.use(bodyParser.json());
  app.use(cookieParser());
  app.use(csurf({ cookie: true }));
  // routes
  app.use(Routes imported from another file);

В настоящее время клиент - это просто простая форма в реакции. Я загружаю некоторые исходные данные до того, как приложение реагирует на загрузку, и там устанавливается csrf cook ie.

У меня есть простая функция для анализа клиента csrf cook ie. Я проксирую сервер express в приложении create-реакции-приложение, поэтому я не могу просто установить метатег в заголовке.


const csrfToken = () => {
  const cookies = decodeURIComponent(document.cookie).split(';');
  const token = cookies.find(cookie => cookie.includes('_csrf'));

  if (token) {
    return token.split('=')[1]
  }
}

Я использую fetch для отправки данных и токена

const response = await fetch(url, {
      credentials: 'include',
      method: 'POST',
      headers: {
        'Connection': 'keep-alive',
        'Content-Type': 'application/json',
        'X-CSRF-Token': csrfToken()
      },
      body: JSON.stringify({ ...body })
    });

Я попытался закомментировать строку, которая говорит приложению использовать csurf, и проверить, что все присутствует в запросе. Я могу убедиться, что повар ie и заголовок совпадают в каждом отправляемом запросе. Все кажется правильным, но я все еще получаю ошибку 403, поэтому я должен что-то упустить. Я в растерянности от того, что это могло бы быть, и все, что я мог найти, прибегая к помощи, - это другие люди, настраивающие свои приложения очень похожим образом.

1 Ответ

1 голос
/ 06 января 2020

Вы читаете содержимое _csrf cook ie и отправляете его обратно в заголовок X-CSRF-Token. Это не будет работать.

Промежуточное программное обеспечение csurf, работающее внутри Express, настроено с помощью этого кода: app.use(csurf({ cookie: true })); для генерации _csrf cook ie и отправки его клиенту. Промежуточное программное обеспечение ожидает, что вы:

  1. Создание второго фрагмента данных CSRF на сервере.
  2. Присоединение второго фрагмента данных к ответу, отправленному клиенту. В результате ответ приходит к клиенту с приложением _csrf cook ie и вторым фрагментом данных.
  3. Убедитесь, что входящий запрос от клиента имеет тот же _csrf cook ie и второй фрагмент данных копируется в одно из шести предопределенных мест / мест (например, заголовок 'X-CSRF-Token' или другое местоположение).

См. this ответь для более подробной информации.

...