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」は処理しません。

このエラーの処理方法は?.Surly は、エラーが Rack レベルで発生するため、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 ドキュメントでも見つかりませんでした (ただし、見落としている可能性があります)。

omn​​iauth-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

私はこのコードを誇りに思っているわけではありませんが、例外を制御する 1 つの方法です ;)。

于 2013-02-26T00:55:22.233 に答える