如何拯救OmniAuth :: Strategies :: OAuth2 :: CallbackError?

我正在用Omniauth构build一个Rails应用程序来login服务。为了validationGoogle,我使用了OmniAuth Google OAuth2策略 。

当用户点击“允许访问”button时,一切正常。但是,当用户点击“不,谢谢”button提出下面的错误。

OmniAuth::Strategies::OAuth2::CallbackError 

我已经尝试在应用程序控制器中添加下面的救援代码。

 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 

但没有运气。

任何想法?

谢谢 :)

发生这种情况是因为身份validation发生在中间件中,所以您的控制器不参与其中。 这是引发exception的地方,被调用的代码是这个

我想你可以通过在这种types的代码中定义一个在Omniauth初始化器中的callback来处理这种错误

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

否则三个月前就会有这样的行为

 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 

其中指出,如果错误,您的用户将被redirect到/auth/failure并显示一条错误消息,所以您应该能够为该path定义路由并在您的应用中处理它。 请记住,这不会发生在开发模式,所以你需要尝试在其他的环境。 如果这在生产中没有发生,请尝试将您的omniauth gem升级到版本1.1.0

你可以在omniauth初始化器中以更清晰的方式设置on_failure proc:

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

我用法比奥的第一个build议解决了这个问题。

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

在我的UsersController

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

有一个configuration使用/auth/failure而不是引发错误。

我使用OmniAuth 1.2.2,当我检查FailureEndpoint时,我发现代码是这样的:

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

这里定义了failure_raise_out_environments

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

环境可以configuration,所以解决scheme很简单。 我使用Rails,所以我把下面的代码放在一个初始化文件中:

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