【问题标题】:In a Sinatra App on Heroku, Session Is Not Shared Across Dynos在 Heroku 上的 Sinatra 应用程序中,会话未在 Dynos 之间共享
【发布时间】:2011-09-01 04:33:21
【问题描述】:

这是有道理的。但是对于这个问题有哪些首选的解决方法?

【问题讨论】:

标签: ruby-on-rails ruby heroku sinatra


【解决方案1】:
# In your app.rb file just add following - 
enable :sessions
set :session_secret, "some_random_value" 

【讨论】:

    【解决方案2】:

    您还可以使用 memcached 会话来提高性能或安全性。没有尝试过,但看起来很容易。在 heroku 上免费 5MB。

    【讨论】:

      【解决方案3】:

      在我的评论中,我建议使用 rack cookie based sessions,但仔细研究,Sinatra 会话 无论如何都是 Rack cookie 会话。

      再往前看,我found this in the Sinatra docs

      为了提高安全性,cookie 中的会话数据使用会话密钥进行签名。 Sinatra 会为您生成一个随机秘密。但是,由于此密码会随着您的应用程序的每次启动而改变,您可能需要自己设置密码,以便您的所有应用程序实例共享它:

      set :session_secret, 'super secret'

      所以似乎每个 Heroku dyno 正在生成不同的密钥,因此无法读取彼此的会话 cookie,您需要指定一个密钥,以便每个 dyno 使用相同的密钥。

      与其在源代码中添加密钥,不如设置environment variable

      $ heroku config:add SESSION_KEY=a_longish_secret_key
      

      然后在您的 sinatra 应用中:

      enable :sessions
      set :session_secret, ENV['SESSION_KEY']
      

      【讨论】:

      • 看起来不错。还没有机会确认。基于 3 票赞成,我接受答案。
      • 由于环境变量在开发中并不总是可用,我建议set :session_secret, ENV['SESSION_SECRET'] || 'something'
      猜你喜欢
      • 2012-12-30
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2014-09-30
      • 2023-03-27
      相关资源
      最近更新 更多