生产环境Rails 6应用请求被拒绝:InvalidAuthenticityToken问题排查
Rails 6多服务器环境下CSRF验证失败排查方案
问题场景
生产环境部署Rails 6应用,采用负载均衡器搭配两台应用服务器(d1、d2)。已统一两台服务器的secret_key_base,但master.key仍不相同,目前d1持续出现请求被拒绝的情况,报错为CSRF令牌验证失败,d2运行正常。
错误日志
Started POST "/users/sign_in" for 127.0.0.1 at 2024-01-29 11:29:58 +0500 I, [2024-01-29T11:29:58.069581 #46746] INFO -- : [b21faa00-fb11-479a-b646-9920137ea709] Processing by Devise::SessionsController#create as HTML I, [2024-01-29T11:29:58.069638 #46746] INFO -- : [b21faa00-fb11-479a-b646-9920137ea709] Parameters: {"authenticity_token"=>"V38ZddJOJOTEGOs8AuscUnhFHb8/02DW1hD0cQY2t3yuJQwVc5GOrN557F3pAEUiz04bMpUmLE/yEfPY9gZKNw==", "user"=>{"email"=>"ansm6927@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"} W, [2024-01-29T11:29:58.070552 #46746] WARN -- : [b21faa00-fb11-479a-b646-9920137ea709] Can't verify CSRF token authenticity. I, [2024-01-29T11:29:58.070741 #46746] INFO -- : [b21faa00-fb11-479a-b646-9920137ea709] Completed 422 Unprocessable Entity in 1ms (Allocations: 954) F, [2024-01-29T11:29:58.071201 #46746] FATAL -- : [b21faa00-fb11-479a-b646-9920137ea709] [b21faa00-fb11-479a-b646-9920137ea709] ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
排查与解决步骤
- 统一
master.key与凭证文件:master.key负责解密config/credentials.yml.enc,如果d1的master.key无法正确解密该文件,会导致实际运行的加密密钥异常。将d2的master.key和credentials.yml.enc同步到d1,确保两台服务器凭证配置完全一致。 - 重启d1应用进程:修改密钥配置后,必须重启d1上的Rails服务(如Puma、Unicorn),确保新配置加载生效。
- 启用负载均衡会话粘性:若负载均衡器未配置会话粘性,用户请求可能在d1、d2间跳转,导致跨服务器的CSRF令牌验证失败。开启基于Cookie的会话持久化,让同一用户的请求始终路由到同一服务器。
- 验证d1密钥配置:在d1的控制器中临时添加调试代码,确认密钥和令牌生成正常:
puts "CSRF Token: #{form_authenticity_token}" puts "Secret Key Base: #{Rails.application.secret_key_base}" - 检查d1环境变量:确认d1的环境变量中没有覆盖
secret_key_base或RAILS_MASTER_KEY,避免配置冲突。 - 清理缓存:执行
rails cache:clear清理d1的Rails缓存,同时指导用户清理浏览器缓存,避免旧令牌残留。
内容的提问来源于stack exchange,提问作者Muhammad Ans
相关产品推荐
相关产品推荐

