在深入了解标题之前,我只想从基本层面描述问题。在我的应用程序中的异步请求之后,我收到了可怕的 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 控制器中工作得非常好,因为安全性不是这个阶段最大的问题,但我宁愿修复令牌问题。谢谢!