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)