2012-02-06 12 views
7

En la aplicación my rails 3 utilizo Omniauth para la parte de autenticación del usuario (fb/twitter).La sesión de Omniauth caduca cuando el navegador está cerrado

En realidad me siguen esta:

https://github.com/RailsApps/rails3-mongoid-omniauth

https://github.com/RailsApps/rails3-mongoid-omniauth/wiki/Tutorial

Pero, Al cerrar la sesión del navegador expira y necesito volver a iniciar sesión. ¿Cómo puedo mantener la sesión para los usuarios recurrentes?

¡Cualquier ayuda sería muy apreciada!

+0

claro: qué sucede esto solo en su entorno/navegador local? ¿Cómo funciona su entorno de prueba con las cookies HTTP? – mkro

+0

después de iniciar sesión, el session_controller almacena user_id: session [: user_id] = user.id https://github.com/RailsApps/rails3-mongoid-omniauth/blob/master/app/controllers/sessions_controller.rb – Lamp

+0

No se puede decir realmente qué sucede en su aplicación, pero tal vez quiera consultar la duración de la cookie y otras configuraciones de las cookies de sesión de rails: http://oldwiki.rubyonrails.org/rails/pages/HowtoChangeSessionOptions – mkro

Respuesta

4

Devise ofrece esta funcionalidad a través de su módulo Rememberable. OmniAuth se integra fácilmente con él a través del módulo (nunca lo adivinarás) OmniAuth. ¡Incluso se menciona en el segundo enlace que publicaste!

+0

[Aquí está] (https: // github. com/plataformatec/devise/wiki/OmniAuth: -Overview) la página wiki de Devise sobre la integración con OmniAuth. –

+0

¡Lo intentaré! ¡Gracias! – Lamp

+0

Vic, ¿tuviste problemas con eso? –

1

Asegúrate de que la política de cookies que sigue tu aplicación de carriles tiene una configuración sensata para tu caso de uso (mira el enlace en mi comentario anterior). Todo lo que puedo imaginar en este momento (sabiendo lo que sé, sentado donde me siento) es que las cookies tienen (s/ve) propiedades que son subóptimas/indeseables en su contexto.

Compruebe la configuración de las cookies en una herramienta de depuración/desarrollo de navegador como firebug, firecookie o las herramientas de desarrollo de Chrome.

Lo siento, eso es todo lo que puedo pensar dado mi conocimiento del problema. No dude en ponerse en contacto conmigo de nuevo con más detalles sobre su configuración de cookies y pruebas.

Mi 2Cents.

+0

Gracias por su respuesta! Pero como puede ver aquí, no es un problema de cookies: http://stackoverflow.com/questions/4475726/devise-and-omniauth-remembering-oauth – Lamp

9

Lo que desea no es difícil, solo tiene que establecer una cookie permanente cuando se crea la sesión y luego recuperar este valor cuando configura el usuario actual.

En su ApplicationController, acaba de cambiar su método de current_user a:

def current_user 
    return unless cookies.signed[:permanent_user_id] || session[:user_id] 
    begin 
    @current_user ||= User.find(cookies.signed[:permanent_user_id] || session[:user_id]) 
    rescue Mongoid::Errors::DocumentNotFound 
    nil 
    end 
end 

Y en su SessionsController, modificar create para establecer la cookie si el usuario desea:

def create 
    auth = request.env["omniauth.auth"] 
    user = User.where(:provider => auth['provider'], 
        :uid => auth['uid']).first || User.create_with_omniauth(auth) 
    session[:user_id] = user.id 
    cookies.permanent.signed[:permanent_user_id] = user.id if user.really_wants_to_be_permanently_remembered 
    redirect_to root_url, :notice => "Signed in!" 
end 
+0

¡Gracias por su respuesta!¡Combiné el diseño y mi problema fue resuelto! – Lamp

+0

Realmente no debería usar user_id en la cookie firmada, la forma correcta sería crear un token remember_me en su modelo de usuario, guardarlo en la cookie permanente y cuando no tenga una sesión actual, cree una nueva uno al buscar el token remember_me. Los tokens son más difíciles de adivinar que cambiar tu uid si un hacker descubre cómo sortear la firma de cookies (ya se ha hecho antes). –

Cuestiones relacionadas