10

我在我的 Rails 应用程序中有一个反应组件,我试图用它向托管在 localhost 上的 Rails 应用程序fetch()发送POST,这给了我错误:

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

我正在使用设计 gem 来处理user/registrationslogins.

我试图删除protect_from_forgery with: :exception

这是我获取的代码,

this.state.ids.sub_id});
  fetch(POST_PATH, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: body  
  }).then(res => res.json()).then(console.log);

如何获取 csrf 令牌并通过表单发送它以使其通过?
理想情况下,我只想通过标头发送它,但我不知道如何访问令牌。

4

3 回答 3

17

如果您只是在 Rails 视图中嵌入一个 React 组件,那么最简单的方法是从 Rails 视图中检索 csrf 令牌,然后将其作为标头传递给您的 fetch api 调用。

您可以通过执行以下操作获取 csrf 令牌:

const csrf = document.querySelector("meta[name='csrf-token']").getAttribute("content");

然后你只需在 fetch 调用中将它作为标题传递: ... headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrf }, ...

我通常不使用 fetch,因此不太确定确切的语法,但这应该有助于指导您。

于 2019-02-21T13:43:27.943 回答
2

谢谢!我最终将此作为一个可行的解决方案:在呈现我的反应组件的视图中

<% csrf_token = form_authenticity_token %>

<%= react_component('ExerciseDisplay', {
  program: @program.subprograms.first.exercises, ids: {sub_id: @program.subprograms.first.id, team_id: @team.id, token: csrf_token}
}) %>

我将令牌传递到状态,然后通过 fetch 访问它:

  fetch(POST_PATH, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CSRF-Token': this.state.ids.token
      },
      body: body  
}).then(res => res.json()).then(console.log);
于 2019-02-21T14:59:25.067 回答
0

我在使用rails 5.2时也遇到了同样的问题,我可以通过添加来解决这个问题

protect_from_forgery with: :null_sessionapplication_controller.rb 我从这里得到这个,请参考这个

于 2019-05-06T19:23:59.950 回答