AWS Elastic Beanstalk上的Rails应用程序返回422,“无法验证csrf令牌”

问题描述 投票:0回答:3

我有一个使用Puma&nginx的Rails 5.1.4应用程序,它已经在Elastic Beanstalk(AWS)上运行了一段时间。我最近在同一个地方开了一个新的QA环境,并且在HTML调用(API调用工作正常)上的POST请求中得到422个错误,并显示消息“无法验证csrf令牌”。每个配置值都相同或等效。

我添加了必要的标签并检查了真实性标记值。在<head>标签下我有:

<meta name="csrf-param" content="authenticity_token">
<meta name="csrf-token" content="acYjbDMNDXsw+mHN7pM/4XldHungS9kDlkkTT1moNQaf1y7wRhLJhOVb7GTMDieLU4kGc7yWlOch4DlG/z/A8g==">

在我的登录表单上,我有以下内容:

<input type="hidden" name="authenticity_token" value="acYjbDMNDXsw+mHN7pM/4XldHungS9kDlkkTT1moNQaf1y7wRhLJhOVb7GTMDieLU4kGc7yWlOch4DlG/z/A8g==">

在日志中我收到参数:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"acYjbDMNDXsw+mHN7pM/4XldHungS9kDlkkTT1moNQaf1y7wRhLJhOVb7GTMDieLU4kGc7yWlOch4DlG/z/A8g==", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"1"}}

我也有rack-cors gem和以下配置:

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end

我一直试图解决这个问题几天了,我很遗憾怎么回事,关于可能造成这种情况的任何想法?任何其他可能有助于找出问题的信息?

ruby-on-rails amazon-web-services nginx ruby-on-rails-5 amazon-elastic-beanstalk
3个回答
0
投票

我的第一个猜测是涉及到一些HTML缓存,因为令牌不同。我在针对Rails后端运行Varnish时遇到了类似的行为,你有像Rack :: Cache或Nginx的代理缓存这样的东西吗?


0
投票

因此,如果它在将来帮助某人,我设法解决了这个问题,尽管不完全。在我的nginx配置中,我有这一行:

server_name *.myappdomain.com;

myappdomain是我的生产域名。我试图使用我的elasticbeanstalk url登录,这就像http://myapp-stage.region.elasticbeanstalk.com。我在路由53的DNS上添加了一个条目,将stage.myappdomain.com别名为弹性beanstalk URL并且它有效。我怀疑使用nginx配置可以更好地解决这个问题。


0
投票

这可能发生的另一个原因是:如果nginx使用普通的http连接到rails服务器,默认情况下,如果它们被标记为安全(它们应该是),nginx将不允许rails访问cookie。有多种方法可以配置NGINX来传递它们 - 可以在the unix & linux stackexchange上找到一个很好的总结

(请注意,这可能不是唯一可能发生的情况,因此如果可能,请检查堆栈每个层的配置)

© www.soinside.com 2019 - 2024. All rights reserved.