2012-06-20 38 views
4

我使用的是Omniauth for Rails 3.2.3应用程序。为什么OmniAuth :: Strategies :: Facebook :: NoAuthorizationCodeError没有在omniauth on_failure回调中处理?

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

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

此处理错误 “OmniAuth ::策略:: CallbackError”,而不是 “OmniAuth ::策略:: Facebook的:: NoAuthorizationCodeError”。

如何处理这个错误?。很明显,我不能使用rescue_from作为机架级别的错误发生。

任何想法?

谢谢

回答

1

我遇到了同样的问题。

通过我的谦虚调查,它似乎是在omniauth-facebook gem(并在其他几个快速浏览)实施的策略中的错误。 This是omniauth中异常处理的一个很好的写法。它说,

... OmniAuth策略,如果他们遇到问题,调用该方法失败!并传递一个描述问题的符号:invalid_credentials和他们遇到的异常。失败!方法结束调用OmniAuth.config.on_failure和机架环境中传递(做了一些其他的东西像粘异常进入环境后...

同样可以从example原始作者好心推断在source这没有强调,我还没有在wiki文档中找到它,但是(但我可能忽略了)

许多策略,包括omniauth-facebook,目前引发了我们无法理解的异常应用程序级别

+0

你是否设法解决这个问题。我正努力想赶上这个例外 –

3

确保您的Facebook应用程序不是runni在“沙盒模式”

+0

或为试图使用应用程序的人创建一个Facebook开发人员帐户 – montrealmike

0

@soundar:我希望它的工作方式,如广告。

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

@乔恩日:我不得不为了修补机架应用为“omniauth Facebook的”(1.4.0)来获取我所需要的报告:

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 

我并不以此为荣代码,但它是获得对该异常的控制权的一种方式;)。

+0

您可以在rails中添加该代码吗? – golfadas

+0

你可以把它放在初始化程序中。也许config/initializers/omniauth.rb – nbrustein