Rails 仅在生产时才在页面重新加载时丢失会话变量 current_user_id(React 16.13、Rails 6、Heroku)
Posted
技术标签:
【中文标题】Rails 仅在生产时才在页面重新加载时丢失会话变量 current_user_id(React 16.13、Rails 6、Heroku)【英文标题】:Rails loses session variable current_user_id on page reload only on production (React 16.13, Rails 6, Heroku) 【发布时间】:2021-01-31 07:18:36 【问题描述】:在本地一切正常。 用户登录 -> 用户 ID 保存在 Rails 会话中 -> 刷新浏览器 -> 仍按预期登录。 但是,在 Heroku 上,流程中断了。 用户登录 -> 用户 ID 保存在 Rails 会话中 -> 刷新浏览器 -> 会话变量 :current_user_id 已消失,他们已注销。
它被设置为标准的 Rails 应用程序(不仅仅是 api)。
config.ru(也放在 cors.rb 中)
use Rack::Cors do
allow do
origins 'http://localhost:3000', 'https://client-side.herokuapp.com'
resource '*',
headers: :any,
methods: [:get, :post, :delete, :put, :options],
credentials: true
end
end
session_store.rb
if Rails.env === 'production'
Rails.application.config.session_store :cookie_store, :key => '_myapp', domain: 'app-client.herokuapp.com'
else
Rails.application.config.session_store :cookie_store, key: '_myapp'
end
应用程序.rb
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore
config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore)
从这篇文章中复制了上面的application.rb代码sn-p:Adding cookie session store back to Rails API app 但这没有任何区别。可能是因为我的是标准 Rails 应用,而他们的只是 API 应用。
有谁知道什么会导致会话变量 key :current_user_id 及其值仅在生产模式(Heroku)中不存在于会话对象中? ie cookie 永远不会被写入。
【问题讨论】:
这不是问题的确切原因,但Rails.env === 'production'
真的很臭。三等号运算符根据左右操作数的类别做不同的事情。如果您想进行字符串比较,请使用Rails.env == 'production'
- 但您也可以只使用Rails.env.production?
,因为它是StringInquirier 的一个实例。见medium.com/rubyinside/triple-equals-black-magic-d934936a6379
【参考方案1】:
我遇到了一个非常相似的问题,我想我已经找到了解决方案。 和你一样,我的代码正在开发中,但在推送到 Heroku 后,我会在重新加载时失去会话。
就我而言,我的 React 应用程序托管在 x-frontend.herokuapp.com
上,rails 应用程序托管在 x-backend.herokuapp.com
上。 rails 应用程序必须将此设置视为两个不同的域,并且一个域被阻止保存在另一个域中使用的 cookie。
什么对我有用:
在gemfile.rb
:
gem 'rails_same_site_cookie'
在config/environments/production.rb
:
config.action_dispatch.cookies_same_site_protection = :None
【讨论】:
以上是关于Rails 仅在生产时才在页面重新加载时丢失会话变量 current_user_id(React 16.13、Rails 6、Heroku)的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak Kubernetes GKE NGINX Ingress - 重新加载页面时重新启动 pod 后会话丢失并返回 502 Bad Gateway