¿Por qué la devolución de llamada de Devise + Omniauth no llega al controlador correcto?

¿Alguien puede ayudarme a llegar al fondo de este problema?

Estoy usando Devise + Omniauth en una aplicación Rails 3.2. Lo que quiero saber es qué está pasando detrás de escena con Devise. user_omniauth_authorize_path(provider) método.

He investigado las rutas de rake y la fuente de la gema, pero no puedo ver nada obvio que pueda causar el problema que tengo.

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 route.rb.

En mis rutas.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 users/omniauth_callbacks_controller.rb tengo

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

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

En una vista que tengo <%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>. Al hacer clic en este enlace, se accede a Twitter, donde puedo iniciar sesión, pero al volver a mi aplicación aparece el mensaje de error "Ya inició sesión".

No puedo averiguar cómo o por qué se genera este error. Solo debería estar viendo "Esto funciona" o "Esto no funciona".

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

Si reemplazo el enlace omniauth de Devise con <a href="/es/users/auth/twitter">Twitter</a> luego obtengo "Esto funciona".

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

¿Alguien puede arrojar algo de luz?

EDITAR

Las rutas de rastrillo se ven así:

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

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

Bueno, está funcionando para mí, por lo que definitivamente es algo de tu parte. En primer lugar, ¿has comparado en la consola las llamadas GET? /users/auth/twitter y /users/auth/twitter?callback obtenido por los 2 métodos diferentes? Deben verse exactamente iguales (excepto por el token y el verificador, por supuesto).

Ahora, no estoy seguro de si esto está relacionado, pero con el dispositivo no usa una ruta de tránsito, por lo que puede eliminar esa ruta. En su lugar, en su controlador de devoluciones de llamadas, debe implementar una acción llamada falla que maneja una solicitud incorrecta. Mira aquí para la implementación del dispositivo.

Me estoy aferrando a las pajitas aquí, pero también debería tener esto 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

contestado el 05 de mayo de 12 a las 05:05

hola askitaka, gracias por estas sugerencias. Estoy usando passthru basado en recomendaciones github.com/plataformatec/devise/wiki/OmniAuth:-Resumen y stackoverflow.com/questions/5531263/… wrt ruta globbing. ¿Esto ya no es recomendable? De todos modos, me has dado algunas cosas nuevas en las que pensar. ¡Gracias! Probaré esto y volveré a informar. - andy harvey

hola ashitaka, ¿podría explicar lo que quiere decir comparando las llamadas GET? he corrido app.get '/users/auth/twitter' en la consola Ambas llamadas regresan 302, que es de esperar. ¿Hay alguna forma de examinar estas llamadas con más detalle? ¿O seguir la redirección 302? - andy harvey

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

Lo que quise decir cuando te dije que compararas las llamadas GET fue que hicieras clic en el enlace con <a href... y luego en el enlace con ...path(:twitter) y mire la consola para ver exactamente qué datos se enviaban a Twitter y qué datos se devolvían. Si coincidía, significaría que era algo en el controlador. Bueno, me alegro de haber podido ayudar! - Ashitaka

oh ok, en los registros. Gracias por la aclaración. ¡Y gracias una vez más por encontrar el problema! - andy harvey

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.