¿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)
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é. –
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? –
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! –