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

时间:2019-02-07 02:16:32

标签: ruby-on-rails amazon-web-services nginx ruby-on-rails-5 amazon-elastic-beanstalk

我有一个使用Puma和nginx的Rails 5.1.4应用程序,该应用程序已经在Elastic Beanstalk(AWS)的生产环境中运行了一段时间。我最近在同一个地方打开了一个新的质量检查环境,并通过消息“无法验证csrf令牌”对HTML调用(API调用工作正常)的POST请求不断收到422错误。每个配置值都相同或相等。

我添加了必要的标签并检查了真实性令牌值。在<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"=>"someemail@mail.com", "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

我已经尝试解决这一问题了几天,但我对如何进行下去已经完全迷失了,关于什么可能导致这种情况的任何想法?还有其他可能对解决问题有用的信息吗?

3 个答案:

答案 0 :(得分:0)

我的第一个猜测是,由于令牌的不同,其中涉及一些HTML缓存。在Rails后端上运行Varnish时,我已经看到类似的行为,您是否有Rack :: Cache或Nginx的代理缓存之类的东西?

答案 1 :(得分:0)

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

server_name *.myappdomain.com;

myappdomain是我的生产域。我试图使用我的elasticbeanstalk url(类似于http://myapp-stage.region.elasticbeanstalk.com)登录。我在路由53上的DNS中添加了一个条目,为弹性beantalk URL别名stage.myappdomain.com起了作用。我怀疑使用nginx配置多玩一点也会解决这个问题。

答案 2 :(得分:0)

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

上找到一个很好的摘要

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