2012-02-06 11 views
5

私はFacebookでログインする必要があるwebappを書いています(Facebooklessログインはアプリケーションのコンテキストでは意味がありません)。理想的には、最初の訪問後、ユーザーが/indexを訪問すると、私のwebappは以前にデートしたクッキーを見て、自動的にユーザーをシームレスに記録し、アプリケーション(/app)に行きます。Webサイトのログイン:ユーザーのFacebookログアウトを処理するベストプラクティス?

私の問題は、ユーザーがFacebookからログアウトして自分のアプリに戻るときに発生します。私のドメイン上のCookieはまだ存在し、そのoauth_tokenはまだ有効です(現在は60日間)、私はユーザーを自動的にログオンすることができ、アプリケーションは期待どおりに動作します。

私には、FacebookにサインインしていなくてもFacebookアカウントにサインインしているとは思われません。私はStackoverflow自体で遊んだ。この動作も同様に許可されます。私の心配は間違っているか、初めて私のサーバーから/indexを要求したときにユーザーがFacebookにサインインしているかどうかを確認するための推奨方法があります。

答えて

2

私の意見では、ユーザーがすでにFacebookからログアウトしている間は、あなたのアプリがサインインしたままになるとは思わない。

これは望ましくないシナリオの1つです。公共のコンピュータからアプリを使用している場合はどうなりますか?私がFacebookからログアウトすると、あなたのアプリはまだ私を "覚えている"。そして今、このコンピュータを使用する人はあなたのアプリの中で私のFacebookの身元を引き受けます。

ここでの問題は、ユーザーのFacebookのログインステータスを覚えておくために独自のCookieを設定することだと思います。明らかに、ユーザーがFacebook自体からサインアウトすると、あなたのクッキーはクリアされません。だからこの時点であなたのクッキーはFacebookのステータスと同期していません。

ユーザーのFacebookログインステータスを覚えておくために、独自のCookieを使用しないことをおすすめします。この目的のためにFacebook自身に常に頼ってください。

一般的な戦略は、ユーザーがあなたのアプリに来るたびにFacebookが提供するメカニズムを使ってFacebookのログインステータスを確認することです。このようにして、あなたのアプリはユーザーのログイン状態に関してFacebookと同期します。

私は個人的には、ユーザのログインのためにFacebookのJavascriptのAPIを呼び出すためのコードのこの部分を使用します。

/* 
* Init code for Facebook connect 
*/ 
window.fbAsyncInit = function() { 
     FB.init({ 
       appId  : FACEBOOK_APP_ID, // App ID 
       channelUrl : CHANNEL_URL, // Channel File 
       status  : true, // check login status 
       cookie  : true, // enable cookies to allow the server to access the session 
       xfbml  : true, // parse XFBML 
       oauth  : true 
     }); 

     // check facebook login status 
     FB.getLoginStatus(function(response) { 
       console.log("FB login status: " + response.status); 
       if (response.status === 'connected') { 
         showWelcome(); //display welcome message 
       } else if (response.status === 'not_authorized') { 
         // the user is logged in to Facebook, but not connected to the app 
         showFbLogin(); //display Facebook Login button 
       } else { 
         // the user isn't even logged in to Facebook. 
         showFbLogin(); //display Facebook Login button 
       } 
     }); 

     // subscribe to facebook events 
     FB.Event.subscribe('auth.authResponseChange', function(response) { 
       fbAuthResponseChanged(response); 
     }); 
}; 
+0

問題は、彼らがFacebookのからサインアウトしたときFBJSクッキーが自分のドメインにクリアされません、です。 Facebookからサインアウトして、私のアプリに行くと、私のアプリはまだFBJSのクッキーを見る。私は彼らが実際に私がJavaScriptをロードするまでサインインしていないことを知ることができません。 *ログインしていると余分なリダイレクトが追加されます。なぜなら、/ loginページをロードしなければならないからです。そこでjsは既にログインしていることを知り、/ appにリダイレクトします。 –

+0

毎回、あなたのアプリはログインしているユーザーに代わって何かをしているので、その時点でユーザーが実際にログインしているかどうかを確認する必要があります。あなたのアプリケーションがFacebookユーザーのログ記録状態を記憶するために設定したクッキーがあれば、それに頼るべきではないし、Facebookの状態と同期させておくべきである。 –

+0

たとえば、アプリがFacebookに投稿される前に、FB.getLoginStatus関数を呼び出すことができます。もちろん、これは最適化された方法ではないかもしれません。 –

関連する問題