无法验证CSRF令牌的真实性Rails / React

时间:2019-02-21 13:18:20

标签: ruby-on-rails reactjs csrf protect-from-forgery

我的rails应用程序中有一个react组件,我试图在其中使用fetch()发送 POST 到托管在本地主机上的rails应用程序,这给了我错误: / p>

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

我正在使用devise 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令牌并将其通过表单发送,以便其通过?
理想情况下,我只想通过标头发送它,但是我不知道如何访问令牌。

3 个答案:

答案 0 :(得分:0)

如果仅在Reacts视图中嵌入react组件,最简单的方法是从rails视图中检索csrf令牌,然后将其作为标头传递给fetch api调用。

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

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

然后将其作为标头传递给您的提取调用: ... headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrf }, ...

我通常不使用访存,因此不太确定确切的语法,但这应该可以帮助您。

答案 1 :(得分:0)

谢谢!我最终将其作为可行的解决方案: 在呈现我的React组件的视图中

<% 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(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);

答案 2 :(得分:0)

在使用 rails 5.2 时,我也遇到了同样的问题,并且通过添加

可以解决此问题。 application_controller.rb i got this from here,please refer this

中的

protect_from_forgery with: :null_session