0

编辑我在下面提供了有关我的目标的更多详细信息。

在用户使用 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

我究竟做错了什么?

4

0 回答 0