tutorial rails español ruby sinatra

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: