2011-09-02 12 views
9

私のアプリには、保護されているユーザ認証が必要なアクションがあります。私はdeviseを使用しているので、私はauthenticate_userを使用します!フィルターの前にそれらを保護する。ユーザーが保護されたページにアクセスするたびに、ユーザーにログインを要求し、保護されたページにリダイレクトします。この部分は完全に機能します。Facebookのようなomniauthプロバイダを使用している場合、Deviseは格納された場所に正しくリダイレ​​クトされません

問題は、ユーザーが自分のアプリを通じてFacebookにログインしようとすると、ログインした後、ユーザーが保護されたページにリダイレクトしないということです。ユーザーは常にrootのURLに戻ります。標準認証ではこれは問題ではありません

私はそれがdevise - omniauthの統合に必要なパススルー方法と関係があると思われています。

def facebook 
# You need to implement the method below in your model 
omniauth = request.env["omniauth.auth"] 
@user = User.find_for_facebook_oauth(omniauth, current_user) 

if @user.persisted? 
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" 
    sign_in_and_redirect @user, :event => :authentication 
else 
    session["devise.facebook_data"] = env["omniauth.auth"] 
    redirect_to new_user_registration_url 
end 
end 

def passthru 
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false 
end 
+1

あなたがこれを理解できましたか?私は今、同じ問題を抱えています。私は、deviseとomniauthをどのように統合して前のページにリダイレクトするかを理解できないようです。 – kibaekr

+0

はあなたのクライアントまたはあなたのプロバイダのこのコードですか? – emerak

答えて

9

我々は戻っ にomniauth_callback_controller.rbを返し、ユーザーでに署名したアクセスコードを取得するにはFacebookのJSを使用します。すべてのヘルプは大omniauthコールバックのための私のコードスニペットです。ここ

をいただければ幸いです

リクエストに元のURLが保存されていることがわかりました。 私たちのために治療をしました。

application_controller.rb

def after_sign_in_path_for(resource_or_scope) 
    if request.env['omniauth.origin'] 
     request.env['omniauth.origin'] 
    end 
end 
+0

お返事ありがとうございました。 request.env ['omniauth.origin']とIEの使用に関するいくつかの問題がありますが、ここでは[link](https://github.com/intridea/omniauth/issues/306)で確認できます。しかし、別の問題は、私の保護された要求への呼び出しがajaxであることです。したがって、omniauth.originはそれを反映するのではなく、最後の要求を反映します。 – amunda

+0

また、DeviseでFacebook JS APIを使用しようとしています。どのようにアクセスコードをomniauth_callback_controllerに渡していますか? – CodeWombat

関連する問題