3

クラス Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController があり、 after_omniauth_failure_path_for メソッドをオーバーライドしています:

protected
  def after_omniauth_failure_path_for resource
    '/report_failure'
  end

しかし、呼び出されるのはスーパー 1 です。

パススルーの回避策が原因であると思われます:

  devise_for :users do
    get '/users/auth/:provider'  => 'users/omniauth_callbacks#passthru'
  end

この問題を克服する方法を知っている人はいますか? 私はDevise 2.0.4を使用しています

これはログ ファイル レポートです。

Started GET "/users/auth/facebook/callback?error_reason=user_denied&error=access_denied&error_description=The+user+denied+your+request." for 77.124.184.115 at 2012-04-19 11:34:46 +0000
Processing by Devise::OmniauthCallbacksController#failure as HTML
  Parameters: {"error_reason"=>"user_denied", "error"=>"access_denied", "error_description"=>"The user denied your request."}
Redirected to http://myapp.com/users/sign_in
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)

編集:パススルーリダイレクトを削除すると、機能します:

#       def  devise_for :users do
#        get '/users/auth/:provider'  => 'users/omniauth_callbacks#passthru'
#      end

ありがとうございました

4

2 に答える 2

1

コントローラーをomniauth_callbacks正しく設定しましたが、 orメソッドroutes.rbをオーバーライドできませんでした。問題は、問題のあるユーザー モデルの前に、空のパスを使用して別のデバイス ユーザー モデルをセットアップしていたことです。failureafter_omniauth_failure_path_for

devise_for :customer_users, path: ''
# [...]
devise_for :users, module: 'users' # using a module instead of controllers

これにより、このデバイスのomniauth メソッドのcustomer_userマッピングが常に一致するようになりました。したがって、失敗はデフォルトで処理されました。Devise::OmniauthCallbacksController

Processing by Devise::OmniauthCallbacksController#failure as HTML

この問題は、空ではないパスを設定することで修正できますcustomer_users

devise_for :customer_users, path: 'customer'
# or the default
devise_for :customer_users

誰かが同じ間違いをした場合に、これが役立つことを願っています。

于 2020-07-28T11:21:03.437 に答える
0

パラメーターを devise_for ルート構成に追加するのを忘れました:controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 。これがないと、omniauth は失敗後にどのコントローラーにリダイレクトするかを認識できません。

ところで、パススルーはデバイスの一部ではありません。おそらく自分で追加しましたか?

于 2012-04-28T12:32:09.350 に答える