我在我的Rails 4应用程序中使用Devise和Omniauth。在我看来,我有一个“登录Facebook”按钮,可以将用户引导至user_omniauth_authorize_path(:facebook)
。这按预期工作,并将用户发送到/users/auth/facebook
。然后,该URL似乎正确地将用户重定向到Facebook登录页面。
如何确定此重定向使用的控制器/操作?我想在重定向到Facebook之前设置return_url
。通过继承Devise版本并添加我的代码,我能够在常规Session
和Registration
控制器中执行此操作,如下所示:
class Users::SessionsController < Devise::SessionsController
def new
return_url = params[:return_url]
store_location_for(:user, return_url) unless return_url.nil?
super
end
end
然后,我告诉设计使用我的新控制器:
devise_for :users, controllers: { sessions: 'users/sessions' }
我正在尝试使用omniauth功能完成同样的事情?有没有办法找出用户访问/users/auth/facebook
时访问哪个控制器?如果是这样,我可以将其子类化并以与上面相同的方式添加功能吗?
更新
我通过运行'rake routes'找到了控制器/动作。这就是它所说的:
user_omniauth_authorize GET|POST /users/auth/:provider(.:format) users/omniauth_callbacks#passthru {:provider=>/facebook/}
所以我能够找到正在使用的passthru
方法,但这让我更加困惑。它位于Devise::OmniauthCallbacksController
并说:
def passthru
render status: 404, text: "Not found. Authentication passthru."
end
我很困惑这种方法导致用户被重定向到Facebook。
答案 0 :(得分:0)
看起来您可以将参数传递给user_omniauth_authorize_path
,然后使用request.env["omniauth.params"]
在回调网址中检索它们。所以,我将链接更改为:user_omniauth_authorize_path(:facebook, { return_url: '/test_redirect_path' }
然后在我的OmniauthCallbacksController中我添加了:
store_location_for(:user, request.env["omniauth.params"]["return_url"])
在致电sign_in_and_redirect @user
之前。
这似乎已经成功了。