ruby 3.0.1 rails 6.1.2 'devise', '~> 4.7', '>= 4.7.3'
我处在一个非常不寻常的情况下。我正在将rails安装从一台服务器迁移到另一台服务器。我相信我已经完成了大约95%的工作,刚刚恢复了生产数据库。
但是,任何涉及表单提交的内容,包括用户注册和登录,都会给出一个错误页面:
The change you wanted was rejected.
Maybe you tried to change something you didn't have access to.服务器日志给了我一些更有帮助的东西:
Completed 422 Unprocessable Entity in 2ms (Allocations: 433)
FATAL -- ActionController::InvalidAuthenticityToken这让我很困惑。因为我确实重新生成了master.key和credentials.yml.enc,并通过RAILS_MASTER_KEY环境变量使master.key的内容可用。这意味着表单包含适当的<input type="hidden" name="authenticity_token" value="<removed for stack_overflow>">来防御跨站点脚本攻击。
我不认为这与会话有任何关系,因为即使是用户注册也会受此影响。我正在使用Devise进行身份验证。
但是..。现在我碰壁了。从这里开始无处可去。有人知道哪里出问题了吗?
更新1
添加skip_before_action :verify_authenticity_token确实让我跳过了这个问题。作为一个解决方案,我对此并不满意。
更新2
我有这些meta标签。
<%= csrf_meta_tags %>
<%= csp_meta_tag %>发布于 2021-07-19 10:07:14
您的表单不会随其请求一起发送X-CSRF-TOKEN标头。这个头文件是一个安全特性,关闭它会让你觉得不舒服是对的。这是阻止evil.com上的人向yourwebsite.co发送表单的一部分。
开箱即用的rails <%= forms_* %>为你做了这件事,所以你可能会有一些定制的东西。
如果你从javascript发送这些请求。我这样做:
let token = document.querySelector("meta[name='csrf-token']").content
fetch(url, {
method,
headers: {
'X-CSRF-Token': auth_token, // <---- this
'X-Requested-With': 'XMLHttpRequest',
...
},
...也有可能是您没有将其包含在application.html.erb中,所以表单无法找到它。
<!DOCTYPE html>
<html>
<head>
<%= csrf_meta_tags %> <!-- you need this! -->
...https://stackoverflow.com/questions/68425308
复制相似问题