0

在深入了解标题之前,我只想从基本层面描述问题。在我的应用程序中的异步请求之后,我收到了可怕的 422,无法处理的实体错误(ActionController::InvalidAuthenticityToken)。处理这个问题的最佳方法是什么?

大量答案会说:

skip_before_action :verify_authenticity_token 

(现在是 Rails 6 中的 skip_forgery_protection),然后通常在评论中人们会得到更多的赞成票,询问这是否存在安全风险。大概有5个这样的线程。

但是,这样做的替代方法是将 csrf 令牌与 POST 请求一起发送。所以,大多数答案说确保包含这些标题

'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest'

还有一个 csrf 令牌,例如:

'X-CSRF-Token': csrfToken

问题是获取 csrf 令牌本身。我试过用

  const getHeaders = () => {
     let headers = new window.Headers({
     'Content-Type': 'application/json',
     'Accept': 'application/json',
     'X-Requested-With': 'XMLHttpRequest'
  })

  const csrfToken = document.head.querySelector("[name='csrf-token']")
  if (csrfToken) { headers.append('X-CSRF-Token', csrfToken) }

  return headers
}

  let headers = getHeaders();
  headers.forEach(function(value, name) {
  console.log(name + ": " + value);
  });

那是行不通的。我猜但是我实际上得到的令牌不起作用。即:

document.head.querySelector("[name='csrf-token']")

用普通的 ol' JavaScript 做到这一点的最好方法是什么,没有其他库?我尝试了其他建议和方法来尝试获取令牌,但到目前为止都失败了。我假设这存在于我的浏览器的某个地方,但在哪里?我可以在 Redux 开发工具中看到所有数据,所以问题肯定只是这个令牌,而不是正确发送正确的数据(更不用说 skip_forgery_protection 完全解决了它)。

与此同时,可悲的是,skip_forgery_protection 添加到我的 Rails 控制器中工作得非常好,因为安全性不是这个阶段最大的问题,但我宁愿修复令牌问题。谢谢!

4

0 回答 0