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: