2010-12-17 13 views
18

Por lo tanto, acabo de configurar utilizando Rails 3, Devise y OmniAuth a través de https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview.Devise y OmniAuth recordando OAuth

estoy autenticación satisfactoria a los usuarios a través de Facebook, pero no son "inmemorable" a pesar de estar marcado con:

devise [...]: rememberable, :omniauthable 

intenté llamar:

@the_user.remember_me! 

... en vano. No se está almacenando/configurando ninguna cookie, lo que significa que el usuario no persiste en todas las sesiones.

¿Alguien ha logrado que un usuario procedente de FB sea recordado a través de las cookies? En mi opinión, esto debería estar sucediendo automáticamente.

Gracias por cualquier idea o comentario que puedan tener.

Respuesta

11

Estoy de acuerdo en que esperaría que Devise establezca una sesión antes de que la solicitud vaya a FB. Supongo que esta es una característica que falta de Devise.

Tuve el problema yo mismo donde utilicé token_authenticatable. Un cliente de API estaba llamando a la siguiente dirección URL directamente:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

Como yo estaba usando token_authenticatable yo estaba asumiendo que esto sería sesión del usuario. Lamentablemente, esto no funciona de la caja. Lo que debe hacer para que esto funcione es asegurarse de que el usuario haya iniciado sesión antes de llegar a esta ruta. Puedes hacerlo de otras maneras, pero la forma más fácil es darle una url diferente al cliente API (en este caso "users/connect/facebook". Aquí está mi adición al archivo de rutas que lo hace funcionar (asumiendo que tienes un modelo de usuario con el legado y no ha cambiado los valores predeterminados):

authenticate :user do 
    get 'users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}") 
end 

Esto se asegurará de que la sesión se crea correctamente lo que el usuario está siendo reconocido cuando él/ella regresa de facebook

+0

¿Cómo le dio "dar" al cliente API otra URL? En alguna parte en config/initializers/devise.rb? –

19

I'. Me gustaría elaborar sobre la respuesta (correcta) @ jeroen-van-dijk dio más arriba que funcionó para mí.

En config/routes.rb, agregue una nueva ruta en devise_for bloque:

devise_for :users, :controllers => { 
        :omniauth_callbacks => "user_omniauth_callbacks" } do 
    ... 
    get '/users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}"), 
           :as => 'user_oauth_connect' 

end 

A continuación, cambiar su enlace de "inicio de sesión utilizando facebook", para usar la nueva ruta:

<!-- before it linked to user_omniauth_authorize_path --> 
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %> 

En app/controllers/user_omnniauth_callbacks_controller.rb

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController 
    include Devise::Controllers::Rememberable 

    def facebook 
    @user = User.find(...) 
    ... 
    remember_me(@user) # set the remember_me cookie 
    end 
end 

Esta solución funciona bien para mí usando Rails 3.1 y Devise 1.4.9.

+0

Me perdí la llamada a remember_me en el controlador en lugar del modelo al principio. Finalmente lo hizo funcionar después de incluir el módulo correcto. –

+0

En Rails 3.2.3 y Devise 2.1.2, agregar la línea "incluir" y la llamada "remember_me()" fue suficiente. No tuve que cambiar ninguna ruta. –

+0

@haraldmartin Probé todas las soluciones, pero no funcionan para mí y estoy abriendo una nueva pregunta en la siguiente publicación. ¿Me podría ayudar? Gracias Fabrizio http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable –

0

FYI - si desea utilizar también la función de extend_remember_period de legado - necesita forzar esto en el objeto de usuario en el controlador de devolución de llamada

añadió una línea a la respuesta de @ mustafaturan

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user) 
Cuestiones relacionadas