enable :sessions
set :session_secret, 'secret'
post '/login' do
session[:loggedInUser] = jsondata['username'].to_s
puts session[:loggedInUser] + " is the session"
end
Everything is good at this point. When I read the session like this:
get '/debug' do
session.inspect
end
Its all there. But here comes the problem. When I go for another post request later on:
post '/foo' do
# do nothing
end
The session is cleared.
Why? Is this a bug?
EDIT
I have narrowed the problem down: I proxypass Sinatra through nginx, to http://app.local/backend
- this is when the issue occurs. If I run Sinatra through http://localhost:4567
it all works as expected.
SOLUTION
Use Rack::Session::Cookie
instead of the default enable :sessions
:
use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc
from the Sinatra FAQ:
If you need to set additional parameters for sessions, like expiration date, use Rack::Session::Cookie directly instead of enable :sessions:
I do not see any issues at all. Here is my code. Try this and see if you still have that issue.
This happens because Sinatra regenerates the session cookie on every start of the application, if you run behind apache or a rack server that can start or switch to another instance you will face this problem.
The easier solution is set the secret to a fixed value with something like:
The other answer which suggest do this:
Also work, but just because its setting the secret to a fixed value.
After I add
set :session_secret, SESSION_SECRET
, everything works.Then I find, Sinatra's README does mention about that:
I was suffering from the same issue as you: sessions were being cleared on post.
I have no idea why this works, but this is my solution:
I literally just replaced the
enable :sessions
bit withuse Rack::Session::Cookie ...
and now all is good in the world.