rails ruby-on-rails ruby-on-rails-3 callback oauth-2.0 omniauth

ruby-on-rails - omniauth rails api



Cómo rescatar OmniAuth:: Strategies:: OAuth2:: CallbackError? (4)

Estoy construyendo una aplicación de Rails con Omniauth para el servicio de Omniauth de sesión. Para autenticar Google, estoy usando OmniAuth Google OAuth2 Strategy .

Cuando el usuario hace clic en el botón ''permitir acceso'', todo funciona bien. Pero cuando el usuario hace clic en el botón ''no gracias'', aparece el siguiente error.

OmniAuth::Strategies::OAuth2::CallbackError

He intentado agregar el siguiente código de rescate en el controlador de la aplicación.

class ApplicationController < ActionController::Base rescue_from OmniAuth::Strategies::OAuth2::CallbackError, :with => :omniauth_callback_error_handler protected def omniauth_callback_error_handler redirect_to init_sign_in_users_path end end

Pero sin suerte.

¿Alguna idea?

Gracias :)


Esto sucede porque la autenticación ocurre en un middleware, por lo que su controlador no está involucrado en él. Aquí es donde se genera la excepción y el código llamado es this

Creo que puede manejar este tipo de error definiendo una devolución de llamada en el inicializador Omniauth con este tipo de código

Omniauth.config do |config| config.on_failure do # your handling code invoked in the context of a rack app end end

De lo contrario, hay un compromiso de hace tres meses que introduce este comportamiento

def redirect_to_failure message_key = env[''omniauth.error.type''] new_path = "#{env[''SCRIPT_NAME'']}#{OmniAuth.config.path_prefix}/failure?message=#{message_key}" Rack::Response.new(["302 Moved"], 302, ''Location'' => new_path).finish end

que indica que en los errores a su usuario se le redirige a /auth/failure con un mensaje de error, por lo que debería poder definir una ruta para esa ruta y manejarla en su aplicación. Tenga en cuenta que esto no sucederá en modo de desarrollo, por lo que debe probarlo en otros entornos. Si esto no ocurre en la producción, intenta actualizar tu joya omniauth a la versión 1.1.0


Hay una configuración para usar /auth/failure lugar de generar un error.

Yo uso OmniAuth 1.2.2 y cuando reviso el FailureEndpoint encontré que el código es así:

def call raise_out! if OmniAuth.config.failure_raise_out_environments.include?(ENV[''RACK_ENV''].to_s) redirect_to_failure end

Y failure_raise_out_environments se define here :

def self.defaults @defaults ||= { # other configurations :failure_raise_out_environments => [''development''] } end

El entorno se puede configurar para que la solución sea fácil. Yo uso Rails así que puse el código debajo en un archivo de inicializador:

OmniAuth.configure do |config| # Always use /auth/failure in any environment config.failure_raise_out_environments = [] end


He resuelto este problema con la primera sugerencia de Fabio.

OmniAuth.config.on_failure = Proc.new do |env| UsersController.action(:omniauth_failure).call(env) #this will invoke the omniauth_failure action in UsersController. end

En mi UsersController

class UsersController < ActionController::Base def omniauth_failure redirect_to init_sign_in_users_path #redirect wherever you want. end end


Puede establecer el proceso on_failure en el inicializador omniauth de una manera aún más limpia:

OmniAuth.config.on_failure = UsersController.action(:oauth_failure)