Sinatra在开机自检时清理会话

zte4gxcn  于 2022-10-15  发布在  Ruby
关注(0)|答案(4)|浏览(148)
enable :sessions
set :session_secret, 'secret'

post '/login' do
        session[:loggedInUser] = jsondata['username'].to_s
        puts session[:loggedInUser] + " is the session"
end

在这一点上一切都很好。当我像这样阅读会议时:

get '/debug' do
    session.inspect
end

都在那里了。但问题来了。当我稍后提出另一个帖子请求时:

post '/foo' do
    # do nothing
end

会话被清除。
为什么?这是个窃听器吗?

编辑

我已经缩小了问题的范围:我通过nginx代理Sinatra到http://app.local/backend-这就是问题发生的时候。如果我通过http://localhost:4567运行Sinatra,则一切都如预期的那样工作。

解决方案

使用Rack::Session::Cookie而不是默认的enable :sessions

use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"

# etc

来自Sinatra常见问题解答:
如果需要为会话设置其他参数,如到期日期,请直接使用Rack::Session::Cookie而不是Enable:Session:

70gysomp

70gysomp1#

我和你一样有同样的问题:会议在开机自检时被清除。
我不知道为什么这是可行的,但这是我的解决方案:


# enable :sessions

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'

我真的只用use Rack::Session::Cookie ...替换了enable :sessions位,现在世界上一切都很好。

4nkexdtk

4nkexdtk2#

在我添加set :session_secret, SESSION_SECRET之后,一切正常。

set :session_secret, SESSION_SECRET
enable :sessions

然后我发现,Sinatra的自述文件确实提到了这一点:
为了提高安全性,Cookie中的会话数据使用会话密钥进行签名。辛纳屈会为你生成一个随机的秘密。但是,由于该密码会随着应用程序的每次启动而改变,因此您可能需要自己设置该密码,以便您的所有应用程序示例共享该密码
SET:SESSION_SECRET,‘超级机密’

xsuvu9jc

xsuvu9jc3#

这是因为Sinatra在每次启动应用程序时都会重新生成会话cookie,如果您在可以启动或切换到另一个示例的Apache或机架服务器后面运行,您将面临这个问题。
更简单的解决方案是将密码设置为固定值,如下所示:

set :session_secret, "328479283uf923fu8932fu923uf9832f23f232"
 enable :sessions

另一个答案建议这样做:


# enable :sessions

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'

同样有效,但仅仅是因为它将秘密设置为固定值。

klh5stk1

klh5stk14#

应@moyth的要求,我将我的评论作为单独的回复发布。
我的两点看法是:这发生在我身上是因为Rack::Protection模块正在删除会话。在我的例子中,失败的是HttpOrigin。您可能会发现在Rack::Protection上启用日志记录来查看这一点很有帮助。我没有做到这一点(我使用的是Gollum,不确定在哪里设置这个选项),所以我在Rack::Protection::Base的调用方法中硬编码了一个异常。

相关问题