2010-12-17 12 views
18

私はちょうどhttps://github.com/plataformatec/devise/wiki/OmniAuth:-Overview経由でRails 3、DeviseとOmniAuthを使ってセットアップしました。OAuthを覚えているDeviseとOmniAuth

私は正常Facebook経由のユーザーを認証するんだけど、彼らはでマークされているにもかかわらず "rememberable" ではありません。

devise [...]: rememberable, :omniauthable 

私は呼び出してみました:

@the_user.remember_me! 

...無駄に。保存されている/設定されているCookieはありません。これは、ユーザーがセッション間で持続しないことを意味します。

誰かがクッキーを使って記憶されたFBからソースを取得することができましたか?私の考えでは、これは自動的に起こるはずです。

ご意見やご感想をお寄せいただきありがとうございます。

答えて

11

私は、要求がFBに送られる前にDeviseがセッションを設定すると思うことに同意します。私はDeviseの欠けている機能だと思う。

私はtoken_authenticatableを使用したときに自分自身に問題がありました。 APIクライアントは、直接以下のURLを呼んでいた。

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

私は、これがユーザーに署名すると仮定したtoken_authenticatableを使用していたので。残念ながら、これはそのままでは機能しません。この作業を行うには、このパスに入る前にユーザーがログインしていることを確認する必要があります。あなたは他の方法でそれを行うことができますが、最も簡単な方法は、APIクライアント(この場合は "users/connect/facebook")に別のURLを付けることです。ユーザーの工夫とモデルとあなたがデフォルトを変更していない):

authenticate :user do 
    get 'users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}") 
end 

これは、彼/彼女は、Facebookのから戻ったときにユーザーが認識されているので、セッションが正しく作成されていることを確認します

+0

APIクライアントに別のURLを "与える"方法はありますか? config/initializers/devise.rbのどこかにありますか? –

19

私は」。私のために働いてくれた上記の@ jeroen-van-dijk(正解)の答えを詳しく説明したいのですが。

config/routes.rbにdevise_forブロック:このソリューションは、うまく機能

<!-- before it linked to user_omniauth_authorize_path --> 
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %> 
アプリ/コントローラ/ user_omnniauth_callbacks_controller.rbで

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController 
    include Devise::Controllers::Rememberable 

    def facebook 
    @user = User.find(...) 
    ... 
    remember_me(@user) # set the remember_me cookie 
    end 
end 

devise_for :users, :controllers => { 
        :omniauth_callbacks => "user_omniauth_callbacks" } do 
    ... 
    get '/users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}"), 
           :as => 'user_oauth_connect' 

end 

次に、新しいルートを使用するためのリンク "のFacebookを使用してログイン" あなたを変更私はRails 3.1とDevise 1.4.9を使っています。

+0

私は最初にモデルではなくコントローラでremember_meへの呼び出しを逃しました。最後に、適切なモジュールを組み込んだ後で動作させました。 –

+0

Rails 3.2.3とDevise 2.1.2では、 "include"行と "remember_me()"呼び出しを追加するだけで十分でした。ルーティングを変更する必要はありませんでした。 –

+0

@haraldmartin私はすべてのソリューションを試しましたが、私のためにはうまくいかず、私は次の記事で新しい質問を開きます。手伝っていただけませんか?おかげファブリツィオ http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable –

11

工夫貢献者によって固定されている: あなただけ追加する必要があり

user.remember_me = true 
# then add your signing in code 
sign_in(:user, user) 

REF:https://github.com/plataformatec/devise/issues/776#issuecomment-807152

+1

これが正しい答えである必要があり、私は一日のためにそれを検索した、あなたはsign_in_and_redirect前にこれを設定する必要があります –

0

FYI - あなたも工夫でextend_remember_period機能を使用する場合 - あなたは上でこれを強制する必要があります

コールバックコントローラ内のユーザーオブジェクトは、@ mustafaturanの答えに1行を追加

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user) 
関連する問題