ruby - rails - Sinatra despeja sesión en post
sinatra ruby tutorial (4)
Después de agregar set :session_secret, SESSION_SECRET
, todo funciona.
set :session_secret, SESSION_SECRET
enable :sessions
Entonces me parece que README de Sinatra menciona eso:
Para mejorar la seguridad, los datos de la sesión en la cookie se firman con un secreto de sesión. Sinatra genera para ti un secreto aleatorio. Sin embargo, dado que este secreto cambiará con cada inicio de su aplicación, es posible que desee establecer el secreto usted mismo, de modo que todas las instancias de su aplicación lo compartan :
set: session_secret, ''super secreto''
enable :sessions
set :session_secret, ''secret''
post ''/login'' do
session[:loggedInUser] = jsondata[''username''].to_s
puts session[:loggedInUser] + " is the session"
end
Todo es bueno en este punto. Cuando leo la sesión así:
get ''/debug'' do
session.inspect
end
Está todo allí. Pero aquí viene el problema. Cuando voy a otra solicitud de publicación más tarde:
post ''/foo'' do
# do nothing
end
Se borra la sesión.
¿Por qué? ¿Es esto un error?
EDITAR
He reducido el problema: Proxypass Sinatra a través de nginx, a http://app.local/backend
- esto es cuando ocurre el problema. Si ejecuto Sinatra a través de http://localhost:4567
, todo funciona como se esperaba.
SOLUCIÓN
Use Rack::Session::Cookie
lugar de las enable :sessions
predeterminadas enable :sessions
:
use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc
de las Preguntas Frecuentes de Sinatra :
Si necesita establecer parámetros adicionales para las sesiones, como la fecha de caducidad, use Rack :: Session :: Cookie directamente en lugar de habilitar: session:
Estaba sufriendo el mismo problema que usted: las sesiones se estaban limpiando por correo.
No tengo idea de por qué esto funciona, pero esta es mi solución:
#enable :sessions
use Rack::Session::Cookie, :key => ''rack.session'',
:path => ''/'',
:secret => ''your_secret''
Literalmente, simplemente reemplacé el bit de enable :sessions
con use Rack::Session::Cookie ...
y ahora todo es bueno en el mundo.
Esto sucede porque Sinatra regenera la cookie de sesión en cada inicio de la aplicación, si ejecuta detrás de apache o un servidor de rack que puede iniciarse o cambiar a otra instancia, enfrentará este problema.
La solución más fácil es establecer el secreto en un valor fijo con algo como:
set :session_secret, "328479283uf923fu8932fu923uf9832f23f232"
enable :sessions
La otra respuesta que sugiere hacer esto:
#enable :sessions
use Rack::Session::Cookie, :key => ''rack.session'',
:path => ''/'',
:secret => ''your_secret''
También funciona, pero solo porque establece el secreto a un valor fijo.
No veo ningún problema en absoluto. Aquí está mi código. Intente esto y vea si todavía tiene ese problema.
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: