Supertest запрос с CSRF не удается

У меня есть приложение Express 4, которое делает пользователя csurf для защиты CSRF на маршрутах API. Приложение работает отлично, и защита CSRF действительно работает там, где запросы без csrf-token заголовок выдаст соответствующую ошибку.

Я использую Ava для тестирования с supertest для тестирования маршрутов. Следующий тест завершается неудачно, когда включена проверка CSRF, но проходит, если я удаляю промежуточное ПО:

test('booking api no auth', async t => {
  t.plan(4)

  const server = await request(makeServer(t.context.config, t.context.connection))

  const csrf = await server
    .get('/')
    .then(res => new JSDOM(res.text))
    .then(dom => dom.window.document.querySelector('meta[name="csrf_token"]'))
    .then(csrfMeta => csrfMeta.getAttribute('content'))

  const GET = await server
    .get('/v2/Booking')
    .set('csrf-token', csrf)

  const POST = await server
    .post('/v2/Booking')
    .set('csrf-token', csrf)
    .send({
      name: 'Test',
      description: 'Test',
      category: 'diving',
      minimumPax: 1,
      maximumPax: 2,
      priceAdult: 1,
      priceChild: 1
    })

  const res = { GET, POST }

  t.is(res.GET.status, 403)
  t.deepEqual(res.GET.body, text['403'])
  t.is(res.POST.status, 201)
  t.truthy(res.POST.body._id)
})

Я проверил, что заголовок действительно установлен в запросе. Любые идеи или предложения для альтернативных библиотек, которые работают, приветствуются.

1 ответ

Решение

У меня ранее также были ошибки с supertest и вход в систему, все еще не решена, но с использованием supertest-session кажется, исправил это для меня. Исправить было заменить:

import request from 'supertest'

с

import request from 'supertest-session'

и все волшебно работает.

Другие вопросы по тегам