2012-05-03 11 views
6

¿Alguien puede ayudarme a llegar al fondo de este problema?¿Por qué la devolución de llamada de Devise + Omniauth no llega al controlador correcto?

Estoy usando Devise + Omniauth en la aplicación Rails 3.2. Lo que quiero saber es qué está sucediendo entre bastidores con el método user_omniauth_authorize_path(provider) de Devise.

He tenido una excavación a través de las rutas de rastrillo y la fuente de la gema, pero no veo nada obvio que pueda causar el problema que estoy teniendo.

Supongo que este método simplemente llama a la URL de inicio de sesión del proveedor (por ejemplo, Twitter) y luego regresa a la ruta de devolución de llamada definida en routes.rb.

En mi routes.rb tengo

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'} 

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

En usuarios/omniauth_callbacks_controller.rb tengo

def twitter 
    render :text => "This works" 
end 

def passthru 
    render :text => "This doesn't work" 
end 

En una vista tengo <%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>. Al hacer clic en este enlace, voy a Twitter, donde puedo iniciar sesión, pero al regresar a mi aplicación aparece un mensaje de error "Ya has iniciado sesión".

No sé cómo o por qué se genera este error. Solo debería ver "Esto funciona" o "Esto no funciona".

También tengo un proveedor de Facebook configurado exactamente de la misma manera, y esto funciona como se esperaba.

Si reemplazo el enlace omniauth de Devise con <a href="https://stackoverflow.com/users/auth/twitter">Twitter</a> entonces obtengo "Esto funciona".

Así que esto resuelve mi problema, pero no es ideal y me gustaría saber por qué.

¿Alguien puede arrojar algo de luz?

EDITAR

rutas Rake se ve así:

user_omniauth_callback  /users/auth/:action/callback(.:format)      users/omniauth_callbacks#(?-mix:twitter|facebook) 

Respuesta

1

Bueno, se está trabajando para mí, por lo que es definitivamente algo en su final. En primer lugar, ¿ha comparado en la consola las llamadas GET /users/auth/twitter y /users/auth/twitter?callback obtenidas por los 2 métodos diferentes? Deben verse exactamente iguales (a excepción de la ficha y el verificador, por supuesto).

Ahora, no estoy seguro de si esto está relacionado, pero con la idea de que no utilice una ruta de tránsito, entonces puede eliminar esa ruta. En cambio, en su controlador de devolución de llamada, debe implementar una acción llamada falla que maneja una solicitud incorrecta. See here para la implementación del dispositivo.

estoy agarrando a un clavo ardiendo aquí, pero también se debe tener presente al final de su controlador de devoluciones de llamada:

# This is necessary since Rails 3.0.4 
# See https://github.com/intridea/omniauth/issues/185 
# and http://www.arailsdemo.com/posts/44 
protected 
def handle_unverified_request 
    true 
end 
+0

hi askitaka, gracias por estas sugerencias. Estoy usando 'passthru' según las recomendaciones https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview y http://stackoverflow.com/questions/5531263/omniauth-doesnt-work-with-route -globbing-in-rails3 wrt route globbing. ¿Esto ya no es aconsejable? De todos modos, me has dado algunas cosas nuevas en las que pensar. ¡Gracias! Voy a probar esto e informaré. –

+0

hola ashitaka, ¿podría explicar a qué se refiere al comparar las llamadas GET? He ejecutado 'app.get '/ users/auth/twitter'' en la consola. Ambas llamadas devuelven '302', lo cual es de esperar. ¿Hay alguna manera de examinar estas llamadas con más detalles? ¿O seguir la redirección 302? –

+0

Doh! Habiendo pensado un poco más sobre esto, tienes razón. Fue la función passthru. Estoy usando passthru porque tengo un catch all en routes.rb. Mientras trabajaba en otra cosa, edité esta función para mostrar el texto según mi pregunta. Pero el propósito de este controlador es devolver un 404 en solicitudes omniauth. Sin la función de paso a paso, omniauth simplemente no funciona. Siéntete un poco estúpido ahora :) ¡Gracias por señalar esto, ashitaka! –

Cuestiones relacionadas