编辑我在下面提供了有关我的目标的更多详细信息。
在用户使用 Omninauth gem 通过登录页面登录后,我无法将用户深度链接到我的网站。
最常见的情况是:用户收到一封电子邮件,其中包含指向该站点的深层链接 - 例如 www.mysite.com/suggestions/15。我们在登录页面上放置了一个 Facebook 登录(通过 Omniauth),(授权控制器上的默认登录页面 - 见下文)。当用户尝试在未登录的情况下访问任何其他页面时,他们会通过 authenticate_user 弹回!放置在相关控制器中的辅助方法。authenticate_user 在应用程序控制器中定义 - 见下文。
一旦他们被反弹回来,他们点击登录页面上的“使用 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 中有一个包含:
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
我究竟做错了什么?