【发布时间】:2017-11-10 19:03:24
【问题描述】:
我有一个缓存在 CDN 级别的页面,我希望在该页面上提交表单。
我已关注technique 3 of this post 以异步获取 csrf 元标记,然后将它们发送到表单中,但当我尝试此操作时,我在表单提交控制器操作中收到 ActionController::InvalidAuthenticityToken。一切似乎都正常,但表单仍然被拒绝。
这是提供 csrf 信息的操作:
def csrf_meta
respond_to do |format|
format.json do
render json: {
param: request_forgery_protection_token,
token: form_authenticity_token
}
end
end
end
这是将它附加到<head>的JS函数
function asyncCsrf() {
window.fetch("/async_info/csrf_meta")
.then(function(response) {
response.json().then(function(json) {
console.log(json);
var meta = document.createElement('meta');
meta.name = "csrf-param";
meta.content = json.param;
document.getElementsByTagName('head')[0].appendChild(meta);
var meta = document.createElement('meta');
meta.name = "csrf-token";
meta.content = json.token;
document.getElementsByTagName('head')[0].appendChild(meta);
});
}).catch(function(err) {
console.log(err);
});
}
这是将真实性令牌添加到表单的 JS:
var authToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
// later:
<input type="hidden" name="authenticity_token" value="'+authToken+'">
一切似乎都在那里。令牌随表单一起传递,但ActionController::InvalidAuthenticityToken 仍然存在。
【问题讨论】:
-
你能显示你正在使用的代码,而不是链接吗?
-
@maxpleaner 是的。添加了代码。我的代码与链接的东西基本相同,除了 vanilla js 而不是 jQuery。
标签: ruby-on-rails ruby ruby-on-rails-4 csrf cdn