我有一个使用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
我已经尝试解决这一问题了几天,但我对如何进行下去已经完全迷失了,关于什么可能导致这种情况的任何想法?还有其他可能对解决问题有用的信息吗?
答案 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
上找到一个很好的摘要(请注意,这可能不是唯一可能发生的情况,因此请尽可能检查堆栈每一层的配置)