Sinatra очищает сеанс на почте
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
Сессия очищается.
Почему? Это ошибка?
ИЗМЕНИТЬ
Я сузил проблему: я proxypass Sinatra через nginx, до http://app.local/backend
- это когда проблема возникает. Если я запустил Sinatra через http://localhost:4567
, все будет работать так, как ожидалось.
Решение
Используйте Rack::Session::Cookie
вместо стандартного enable :sessions
:
use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc
из Часто задаваемые вопросы по Sinatra:
Если вам нужно установить дополнительные параметры для сеансов, например, истечение срока действия date, используйте Rack:: Session:: Cookie непосредственно вместо включения: сеансы:
Ответы
Ответ 1
Я страдал от той же проблемы, что и вы: сеансы очищались в должности.
Я понятия не имею, почему это работает, но это мое решение:
#enable :sessions
use Rack::Session::Cookie, :key => 'rack.session',
:path => '/',
:secret => 'your_secret'
Я буквально просто заменил бит enable :sessions
на use Rack::Session::Cookie ...
, и теперь все хорошо в мире.
Ответ 2
После добавления set :session_secret, SESSION_SECRET
все работает.
set :session_secret, SESSION_SECRET
enable :sessions
Затем я нахожу, что Sinatra README упоминает об этом:
Чтобы повысить безопасность, данные сеанса в файле cookie подписываются секретом сеанса. Sinatra генерирует случайный секрет. Однако, поскольку этот секрет будет изменяться с каждым началом вашего приложения, вы можете сами установить секрет, поэтому все экземпляры вашего приложения используют его:
set: session_secret, 'super secret'
Ответ 3
Это происходит из-за того, что Sinatra восстанавливает файл cookie сеанса на каждом запуске приложения, если вы запустите Apache или сервер стойки, которые могут запускаться или переключаться на другой экземпляр, вам придется столкнуться с этой проблемой.
Более легкое решение задает секрет фиксированного значения с чем-то вроде:
set :session_secret, "328479283uf923fu8932fu923uf9832f23f232"
enable :sessions
Другой ответ, который предлагает сделать это:
#enable :sessions
use Rack::Session::Cookie, :key => 'rack.session',
:path => '/',
:secret => 'your_secret'
Также работает, но только потому, что он устанавливает секрет в фиксированное значение.
Ответ 4
Я вообще не вижу никаких проблем. Вот мой код. Попробуйте это и посмотрите, есть ли у вас эта проблема.
require 'sinatra'
configure do
enable :sessions
set :session_secret, 'secret'
end
get '/login' do
session[:foo] = Time.now
"Session value set."
end
get '/fetch' do
"Session value: #{session[:foo]}"
end
get '/foo' do
"Session value: #{session[:foo]}"
end
get '/logout' do
session.clear
redirect '/foo'
end
http://localhost:4567/login #=> Session value set.
http://localhost:4567/fetch #=> Session value: 2013-09-17 09:42:56 +0100
http://localhost:4567/foo #=> Session value: 2013-09-17 09:42:56 +0100
http://localhost:4567/logout #=>(redirects to) http://localhost:4567/foo #=> Session value: