我正在构建一个使用Devise gem进行身份验证的Web应用程序(也有API),我还使用Doorkeeper gem来验证API部分。
问题是,当我转到接收Oauth2代码的URL(并登录)时,我被重定向到Web应用程序而不是客户端回调URL。
我需要做的是在正常登录时重定向到网络应用程序,在使用Oauth时重定向到回调网址。
我该怎么做?我正在覆盖Devise会话控制器,但我不知道该把它放进去。
这是我的代码:
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似乎忽略了我的重定向逻辑。
请进一步咨询。
答案 0 :(得分:11)
假设您的资源为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
答案 1 :(得分:2)
这对我有用,在ApplicationController中(Devise的控制器继承自:)
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
在门卫初始化器中:
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
回调时重定向。
Documentation指出resource_return_to
会话密钥,但这对我有用,所以我不再检查了。