14

我正在构建一个使用 Devise gem 进行身份验证的 Web 应用程序(也带有 API),并且我还使用 Doorkeeper gem 进行 API 部分的身份验证。

现在的问题是,当我转到接收 Oauth2 代码(和登录)的 URL 时,我被重定向到 Web 应用程序而不是客户端回调 URL。

我需要做的是在正常登录时重定向到 Web 应用程序,并在使用 Oauth 时重定向到回调 URL。

我怎样才能做到这一点?我正在覆盖设计会话控制器,但我不知道要放入什么。

这是我的代码:

def new
    session[:return_to] = params[:return_to] if params[:return_to]
    resource = build_resource
    clean_up_passwords(resource)
  end

  def create
    resource = warden.authenticate!(auth_options)
    sign_in(resource_name, resource)
    if session[:return_to]
      redirect_to session[:return_to]
      session[:return_to] = nil
    else
      respond_with resource, :location => after_sign_in_path_for(resource)
    end
  end

问题是 Devise 似乎忽略了我的重定向逻辑。

请进一步咨询。

4

2 回答 2

12

假设您的资源已user 添加session[:user_return_to] = request.fullpath到 resource_owner_authenticator 块

例子:

resource_owner_authenticator do
  #raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}"
  # Put your resource owner authentication logic here.
  # Example implementation:
  session[:user_return_to] = request.fullpath
  current_user || redirect_to(login_url)
end
于 2013-04-04T13:15:01.317 回答
4

这对我有用,在 ApplicationController (设计的控制器继承自):

def store_location
  # store last url as long as it isn't a /users path
  session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
end

def after_sign_in_path_for(_resource)
  session[:previous_url] || root_path
end

在 Doorkeeper 初始化程序中:

resource_owner_authenticator do
  if user_signed_in?
    current_user
  else
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
    redirect_to(new_user_session_path)
  end

结尾

这个想法是在会话 cookie 中记住您来自的路径,然后让 Devise 在调用自己的after_sign_in_path_for回调时重定向到那里。

文档指出了resource_return_to会话密钥,但这对我有用,所以我不再检查了。

于 2015-11-07T19:09:06.220 回答