Где я должен сгенерировать токен CSRF?

Я использую csurf для обработки токенов CSRF в своем экспресс-приложении, но я не знаю, где я должен создать токен. Я не могу использовать маршрут входа, так как функция req.csrfToken() недоступна.

app.use(csrf({ cookie: true }))    
app.post('/signin', function (req, res) {
  // Authentication ...

  res.cookie('XSRF-TOKEN', req.csrfToken()); // Not possible (post request)
})

Должен ли я создать для этого новый маршрут, который я буду использовать каждый раз, когда пользователь открывает интерфейс моего веб-сайта?

app.use(csrf({ cookie: true }))    
app.get('/csrf', function (req, res) {
  res.cookie('XSRF-TOKEN', req.csrfToken());
})

Заранее спасибо!

Редактировать: мой интерфейс (реагировать) отделен от бэкэнда (экспресс-сервера)


person SpoKaPh    schedule 16.11.2020    source источник


Ответы (2)


Есть несколько способов установить токен CSRF:

  1. Вы можете использовать его при рендеринге форм

JS:

var csrfProtection = csrf({ cookie: true })

app.get('/form', csrfProtection, function (req, res) {
  // pass the csrfToken to the view
  res.render('send', { csrfToken: req.csrfToken() })
});

HTML

 <input type="hidden" name="_csrf" value="{{csrfToken}}">
  1. Вы можете использовать его как файл cookie для всех маршрутов. Рекомендуется для одностраничных приложений:
app.all('*', function (req, res) {
  res.cookie('XSRF-TOKEN', req.csrfToken())
  res.render('index')
})
  1. Если у вас есть отдельные серверная и внешняя части, вы можете использовать промежуточное ПО, как показано ниже:

JS:

app.use(express.csrf());
app.use(function(req, res, next) {
  res.locals._csrf = req.csrfToken();
  next();
});

HTML:

input(type='hidden', name='_csrf', value=_csrf)

Подробнее об этом: http://sahatyalkabov.com/jsrecipes/#!/backend/csrf-protection-with-express

person Harshana Serasinghe    schedule 16.11.2020
comment
У меня есть отдельный интерфейс (реакция) и серверная часть (nodejs, экспресс), поэтому я не использую res.render() для своих форм. Мне нужен какой-то способ получить токен CSRF с моего экспресс-сервера в приложение реакции внешнего интерфейса. - person SpoKaPh; 16.11.2020

В итоге я использовал следующий код:

Экспресс-сервер:

app.use(cookieParser());
app.use(csrf({ cookie: true }));
app.get('/csrf', (req, res, next) => {
  res.send({'csrf_token':  req.csrfToken()});
});

Компонент приложения в реакции:

useEffect(async () => {
  try {
    const res = await axios.get('http://api.myserver.com/csrf', { withCredentials: true });
    const csrfToken = (await axios.get('http://api.myserver.com/csrf')).data.csrf_token;
    // save csrfToken to redux store and include it in every request (-> axios interceptor)
  } catch (err) {
    //...
  }
}, [])
person SpoKaPh    schedule 17.11.2020