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

jQuery 脚本仅在它位于函数之上时才有效

当我重新加载页面值不会改变时,它们只在我登录时才会发生

仅在 Angular SPA 中的页面加载之间缓存会话数据

Vue:在路线更改时,仅在完成加载后才呈现页面

Rails 没有在 ajax 帖子上重新加载会话