私の意見では、ユーザーがすでに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);
});
};
問題は、彼らがFacebookのからサインアウトしたときFBJSクッキーが自分のドメインにクリアされません、です。 Facebookからサインアウトして、私のアプリに行くと、私のアプリはまだFBJSのクッキーを見る。私は彼らが実際に私がJavaScriptをロードするまでサインインしていないことを知ることができません。 *ログインしていると余分なリダイレクトが追加されます。なぜなら、/ loginページをロードしなければならないからです。そこでjsは既にログインしていることを知り、/ appにリダイレクトします。 –
毎回、あなたのアプリはログインしているユーザーに代わって何かをしているので、その時点でユーザーが実際にログインしているかどうかを確認する必要があります。あなたのアプリケーションがFacebookユーザーのログ記録状態を記憶するために設定したクッキーがあれば、それに頼るべきではないし、Facebookの状態と同期させておくべきである。 –
たとえば、アプリがFacebookに投稿される前に、FB.getLoginStatus関数を呼び出すことができます。もちろん、これは最適化された方法ではないかもしれません。 –