首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Rails :在表单提交时“您想要的更改被拒绝了”

Ruby on Rails :在表单提交时“您想要的更改被拒绝了”
EN

Stack Overflow用户
提问于 2021-07-18 09:09:21
回答 2查看 338关注 0票数 3

ruby 3.0.1 rails 6.1.2 'devise', '~> 4.7', '>= 4.7.3'

我处在一个非常不寻常的情况下。我正在将rails安装从一台服务器迁移到另一台服务器。我相信我已经完成了大约95%的工作,刚刚恢复了生产数据库。

但是,任何涉及表单提交的内容,包括用户注册和登录,都会给出一个错误页面:

代码语言:javascript
复制
The change you wanted was rejected.

Maybe you tried to change something you didn't have access to.

服务器日志给了我一些更有帮助的东西:

代码语言:javascript
复制
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标签。

代码语言:javascript
复制
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
EN

Stack Overflow用户

发布于 2021-07-19 10:07:14

您的表单不会随其请求一起发送X-CSRF-TOKEN标头。这个头文件是一个安全特性,关闭它会让你觉得不舒服是对的。这是阻止evil.com上的人向yourwebsite.co发送表单的一部分。

开箱即用的rails <%= forms_* %>为你做了这件事,所以你可能会有一些定制的东西。

如果你从javascript发送这些请求。我这样做:

代码语言: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中,所以表单无法找到它。

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
  <%= csrf_meta_tags %> <!-- you need this! -->
...
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68425308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档