0

編集私は以下の私の目的の詳細を提供しました。

ユーザーが Omninauth gem を使用してランディング ページからログインした後、ユーザーを自分のサイトにディープ リンクするのに問題があります。

最も一般的なシナリオは次のとおりです。ユーザーは、サイトへのディープ リンク (たとえば、www.mysite.com/suggestions/15) が記載された電子メールを受け取ります。Facebook ログイン (Omniauth 経由) をランディング ページに配置しました (認証コントローラーのランディング ページの定義 - 以下を参照)。ユーザーがログインせずに他のページにアクセスしようとすると、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 にはインクルードがあります。

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