編集私は以下の私の目的の詳細を提供しました。
ユーザーが 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
私は何を間違っていますか?