编辑我已经在下面详细介绍了我的目标。
在使用Omninauth gem通过着陆页登录后,我无法深度将用户链接到我的网站。
最常见的情况是:用户收到一封电子邮件,其中包含指向该网站的深层链接 - 例如www.mysite.com/suggestions/15。我们在登录页面上放置了一个Facebook登录(通过Omniauth)(授权控制器上的def登陆页面 - 见下文)。当用户尝试访问任何其他页面而未登录时,他们会通过authenticate_user退回!辅助方法放在相关的控制器中。 authenticate_user在Application Controller中定义 - 见下文。
一旦他们被退回,他们点击着陆页上的“登录Facebook”按钮,我们通过def authcreate为用户创建一个会话。这适用于经典的omniauth方式,即来自facebook的回调,其捕获会话令牌。现在,此时我想将用户重定向到他们试图访问的页面(例如www.mysite.com/suggestions/15),而只是通过默认页面(www.mysite.com/suggestions)。当用户已经登录时,这不是问题,但是当他们注销时从不工作。
你可以忽略授权!因为这是一个与管理员权利有关的单独模块(我知道这令人困惑)。同样在check_authorization上。
我创建了一个模块并将其放入lib /
module RedirectModule
def self.included(controller)
controller.send :helper_method, :redirect_to_target_or_default
end
def redirect_to_target_or_default(default, *args)
redirect_to(session[:return_to] || default, *args)
session[:return_to] = nil
end
def redirect_to_or_default(target, *args)
redirect_to(target || default, *args)
end
private
def store_target_location # Friendly redirect: store URL.
session[:return_to] = request.url
end
end
ApplicationController中有一个include:
class ApplicationController < ActionController::Base
protect_from_forgery
check_authorization
include RedirectModule
def current_user
if session[:user_id]
@current_user ||= User.find(session[:user_id])
end
end
helper_method :current_user
def authenticate_user!
if !current_user
store_target_location
redirect_to "/"
end
end
我在以下控制器上启动会话:
class AuthorizationController < ApplicationController
def landingpage
authorize! :auth, :landingpage
if current_user
redirect_to_target_or_default('/suggestions')
else
store_target_location
end
end
def authcreate
authorize! :auth, :authcreate
reset_session
authHash = env["omniauth.auth"]
existingUser = User.where(authHash.slice(:provider, :uid)).first
user = User.from_omniauth(authHash)
session[:user_id] = user.id
redirect_to_target_or_default('/suggestions')
end
def authdestroy
authorize! :auth, :authdestroy
session[:user_id] = nil
redirect_to "/"
end
end
我做错了什么?