【问题标题】:How to rescue from a OAuth::Unauthorized exception in a Ruby on Rails application?如何从 Ruby on Rails 应用程序中的 OAuth::Unauthorized 异常中拯救出来?
【发布时间】:2012-02-10 12:02:48
【问题描述】:

如何从 Ruby on Rails 应用程序中的 OmniAuth 引发的 OAuth::Unauthorized 异常中解救?

显然是这样的:

  rescue_from OAuth::Unauthorized, :with => :unauthorized

不会起作用,因为它只会捕获 Rails 内部抛出的异常,并且此异常会在机架链中的其他位置抛出。

在此应用程序中,管理员(而不是我们,开发人员)配置 twitter 和 facebook 的凭据,因此可能会发生错误的凭据,并且确实会发生。当发生这种情况时,我想显示一个更好的消息“出了点问题”。

更新:我也是asked on the omniauth google group,目前还没有答案,但如果你正在阅读这个问题,你可能想看看。

【问题讨论】:

标签: ruby-on-rails exception-handling omniauth


【解决方案1】:

OmniAuth 从 Rack 中间件运行,因此 rescue_from 不会影响它,因为这是通过 ActionController 进行的 OmniAuth 之上的抽象级别。

此错误通常是由于您的 OAuth 设置配置错误。基本上它是说您的应用程序无权进行身份验证,而不是用户的身份验证失败。

配置错误是您作为开发人员想要缓解的问题,所以我不确定您为什么要挽救这样的异常。

如果您绝对必须挽救此异常,您可以覆盖并使用继承自 OmniAuth 的中间件

module OmniAuth
  module Strategies
    class FacebookWithExceptionHandling < OmniAuth::Strategies::Facebook
      def call
        begin
          super
        raise OmniAuth::Unauthorized => e
          #handle appropriately in rack context here
        end
      end
    end
  end
end

Rails.application.config.middleware.use OmniAuth::Builder do
  provider OmniAuth::Strategies::FacebookWithExceptionHandling, 
    api_key, #your api key 
    secret_key, #your secret key
end

【讨论】:

  • 用户正在为 twitter 和 facebook 配置令牌和密钥。没有什么我不能避免他们在某些时候输入错误的信息。我会更新问题来解释这一点。
  • 好吧,这是有道理的。因此,由于 OmniAuth 只是机架中间件,您可以覆盖机架类。我会在上面更新我的回复
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2017-01-17
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多