4

我正在为 Rails 3.2.3 应用程序使用 Omniauth。

我已经配置了 on_failure 回调,如下所示。

OmniAuth.config.on_failure = Proc.new do |env|
  UsersController.action(:omniauth_failure).call(env)
end

这处理错误“OmniAuth::Strategies::CallbackError”,但不处理“OmniAuth::Strategies::Facebook::NoAuthorizationCodeError”。

如何处理这个错误?我不能使用rescue_from,因为错误发生在机架级别。

有任何想法吗?

谢谢

4

3 回答 3

3

确保您的 Facebook 应用程序未在“沙盒模式”下运行

于 2012-07-19T22:55:28.247 回答
1

我遇到了同样的问题。

根据我的谦虚调查,这似乎是在omniauth-facebook gem中实施的策略中的一个错误(并且,快速浏览了其他几个)。 是一篇关于omniauth 异常处理的好文章。它说

... OmniAuth 策略 [...],如果遇到问题,调用方法失败!并传入一个描述问题的符号,例如 :invalid_credentials 和他们遇到的异常。失败!方法最终调用 OmniAuth.config.on_failure 并传入 Rack 环境(在做了一些其他事情之后,比如将异常粘贴到环境中......

可以从原始作者友好提供的示例中推断出相同的内容。源代码中没有强调它,我也没有在 wiki 文档中找到它(但我可能忽略了)。

许多策略,包括omniauth-facebook,目前都会引发我们无法再在应用程序级别捕获的异常。

于 2012-07-06T13:13:50.590 回答
0

@soundar:我希望它像宣传的那样以这种方式工作。

@fastcatch:正如您所指出的,这些策略没有正确处理这些失败案例。

@Jon Day:我必须为“omniauth-facebook”(1.4.0)修补 Rack 应用程序才能获得我需要的报告:

require 'newrelic_rpm'

module OmniAuth
  class Builder < ::Rack::Builder

    def call_with_error_handling(env)
      begin
        call_without_error_handling(env)
      rescue OmniAuth::Strategies::Facebook::NoAuthorizationCodeError => error
        # Do whatever you'd like when rescuing.. I wanted to report to NewRelic.
        NewRelic::Agent.notice_error(error, env)
        env
      end
    end

    alias_method_chain :call, :error_handling

  end
end

我对这段代码并不感到自豪,但这是控制该异常的一种方法;)。

于 2013-02-26T00:55:22.233 回答