3

我有我的类 Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 并且我覆盖了 after_omniauth_failure_path_for 方法:

protected
  def after_omniauth_failure_path_for resource
    '/report_failure'
  end

但超级的是被调用的那个。

我怀疑这是因为 passthru 解决方法:

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

有谁知道如何克服这个问题?我正在使用设计 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在我的控制器中正确设置了控制器,routes.rb但仍然无法覆盖failureorafter_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

您忘记将:controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 参数添加到 devise_for 路由配置,没有它,omniauth 不知道在失败后重定向到哪个控制器。

顺便说一句,passthru 不是设计的一部分。应该是你自己加的吧?

于 2012-04-28T12:32:09.350 回答