4.7', '>= 4.7.3'我处于一个非常不寻常的情况。我正在将 Rails 安装从一台服务器迁移到另一台服务器。我相信我-6ren">
gpt4 book ai didi

ruby-on-rails - Ruby on Rails : "The change you wanted was rejected" on Form Submission

转载 作者:行者123 更新时间:2023-12-04 07:22:10 24 4
gpt4 key购买 nike

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>">包括以防止跨站点脚本攻击。
我认为这与 session 没有任何关系,因为即使是用户注册也会受此影响。我正在使用 Devise 进行身份验证。
但是......现在我撞到了一堵砖墙。从这里无处可去。有谁知道出了什么问题?
更新 1
添加 skip_before_action :verify_authenticity_token确实让我跳过了这个问题。我对此不满意作为解决方案。
更新 2
我有这些元标记。
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

最佳答案

您的表单未发送 X-CSRF-TOKEN header 以及他们的请求。此 header 是一项安全功能,您关闭它感到不舒服是正确的。这是阻止某人使用 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! -->
...

关于ruby-on-rails - Ruby on Rails : "The change you wanted was rejected" on Form Submission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68425308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com