Я пытаюсь настроить токены CSRF, чтобы я мог выполнить ряд проверок, прежде чем выдать клиенту токен для использования в будущих запросах.
Принимая руководство из документации по csurf , я настроил мой express маршрут со следующим:
const express = require('express');
const router = express.Router({mergeParams: true});
const csurf = require('csurf');
const bodyParser = require('body-parser');
const parseForm = bodyParser.urlencoded({ extended: false });
const ErrorClass = require('../classes/ErrorClass');
const csrfMiddleware = csurf({
cookie: true
});
router.get('/getCsrfToken', csrfMiddleware, async (req, res) => {
try {
// code for origin checks removed for example
return res.json({'csrfToken': req.csrfToken()});
} catch (error) {
console.log(error);
return await ErrorClass.handleAsyncError(req, res, error);
}
});
router.post('/', [csrfMiddleware, parseForm], async (req, res) => {
try {
// this returns err.code === 'EBADCSRFTOKEN' when sending in React.js but not Postman
} catch (error) {
console.log(error);
return await ErrorClass.handleAsyncError(req, res, error);
}
});
Для контекста код React. js выглядит следующим образом: makePostRequest
100% отправляет маркер _csrf
обратно к express in req.body._csrf
try {
const { data } = await makePostRequest(
CONTACT,
{
email: values.email_address,
name: values.full_name,
message: values.message,
_csrf: csrfToken,
},
{ websiteId }
);
} catch (error) {
handleError(error);
actions.setSubmitting(false);
}
Конечная точка почтальона, похоже, отправляет те же данные после загрузки конечной точки /getCsrfToken
, и я вручную обновляю токен _csrf
.
Что-то я не правильно делаю? Я думаю, что это может быть связано с Node.js 's cook ie system.