在Heroku的Sinatra应用程序中,会话不是跨越Dynos共享的

dbg*_*pyd 12 ruby ruby-on-rails heroku sinatra

这是有道理的.但是对于这个问题,有哪些首选的工作方法呢?

mat*_*att 24

在我的评论中,我建议使用基于机架cookie的会话,但研究一下,无论如何,Sinatra会话都是 Rack cookie会话.

往前看,我在Sinatra文档中发现了这一点:

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

set :session_secret, 'super secret'

因此,似乎每个Heroku dyno生成一个不同的密钥,因此无法读取每个其他会话cookie,并且您需要指定一个密钥,以便每个dyno使用相同的密钥.

您可能更好地设置环境变量,而不是在源代码中添加密钥:

$ heroku config:add SESSION_KEY=a_longish_secret_key
Run Code Online (Sandbox Code Playgroud)

然后在你的sinatra应用程序中:

enable :sessions
set :session_secret, ENV['SESSION_KEY']
Run Code Online (Sandbox Code Playgroud)

  • 由于环境变量在开发中并不总是可用,我建议`set:session_secret,ENV ['SESSION_SECRET'] || "something'` (5认同)