2011-10-22 5 views
9

TL; DR Facebook javascript SDKはfacebook.comから直接ログアウトしたユーザーの正確なログインステータスを判別できません。FB JS-SDKはFBのユーザーログアウトを直接検出できません

私は、認証のためにjavascript SDKを使用してFacebookアプリを開発しています。私は、ユーザーがfacebook.com上で直接Facebookからログアウトしたときに、SDKがアプリケーションページでユーザーのログイン状態を理解できないことに気付きました。私はそれを次の簡単なテストケースで煮詰めました。

1つのタブでfacebook.comにログインします。別のタブでは、アプリケーションページを下にレンダリングします(必要に応じてMY_APP_IDを置き換えます)。このアプリに一度も許可を与えていないユーザーとしてFacebookにログインしている場合は、[ログイン]をクリックして許可します。どちらにしても、あなたがログインしていることを示すいくつかのイベントが発生しているはずです。

ここで、facebook.comタブに戻ってログアウトしてください。アプリタブに行き、すべてのボタン(「ログイン」を除く)をクリックして、ブラウザコンソールの出力を確認します。

  • FB.logoutが呼び出されても何も起こりません。コールバックは決して呼び出されません。 Chromeで、次のエラーが表示されます。「URLがhttp://www.facebook.com/のフレームからURL http://my_app.comのフレームにアクセスしようとする安全でないJavaScriptの試み。ドメイン、プロトコル、ポートが一致している必要があります。

  • FB.getLoginStatusが呼び出されると、応答は「接続済み」となり、authResponseオブジェクトを持ちます。しかし、今は間違っているので、これは役に立ちません。代わりに、trueが "force"パラメータのために渡された場合、何も起こりません(コールバックは決して呼び出されません)。

  • FB.getAuthResponseが呼び出されると、何も起こりません(コールバックは呼び出されません)。

  • これの間​​に関連するイベントは発生しません(Facebookのログアウト後)。

この場合、SDKからのユーザーのログインステータスを合法的に判断する方法がないように思われます。または私は愚かな何かをやっているが、私はそれを裸の最小限まで煮詰めた。

私の最終目標はここでは何かをできるようにすることです。ユーザーがすでにFacebookからログアウトしてからログアウトボタンをクリックした場合、この場合はです。しかし、SDKはこれを実現する実行可能な手段を提供しません。

アイデアや考えはありますか?誰かがこれを体験し、回避策を見つけましたか?ありがとう!

シンプルなアプリページ:すべての

<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:fb='http://www.facebook.com/2008/fbml'> 
<head> 
</head> 
<body> 
<script> 
    window.fbAsyncInit = function() { 
    function subFBEvent(name) { 
     FB.Event.subscribe(name, function(r) { 
     console.log(name); 
     console.log(r); 
     }); 
    } 
    subFBEvent('auth.login'); 
    subFBEvent('auth.logout'); 
    subFBEvent('auth.authResponseChange'); 
    subFBEvent('auth.statusChange'); 
    FB.init({ 
     appId : 'MY_APP_ID', 
     status : true, // check login status 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true, // parse XFBML 
     oauth : true  // use OAuth 2.0 
    }); 
    }; 
    (function() { 
    var s = document.createElement('div'); 
    s.setAttribute('id','fb-root'); 
    document.documentElement.getElementsByTagName("body")[0].appendChild(s); 
    var e = document.createElement('script'); 
    e.src = 'http://connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    s.appendChild(e); 
    }()); 
</script> 
<button onclick="FB.logout(function(r) { console.log('FB.logout'); console.log(r); });">Logout</button> 
<button onclick="FB.getLoginStatus(function(r) { console.log('FB.getLoginStatus'); console.log(r); });">LoginStatus</button> 
<button onclick="FB.getAuthResponse(function(r) { console.log('FB.getAuthResponse'); console.log(r); });">AuthResponse</button> 
<fb:login-button>Login</fb:login-button> 
</body> 
+0

のこのページを参照することができます。見てください http://stackoverflow.com/questions/9482876/how-to-detect-user-logging-out-of-facebook-after-logging-into-my-app/16227872#16227872 – Delmo

答えて

-2

まず:は正確にあなたがこれを行うにはしたくない理由は?

Facebookのログインは基本的に、FacebookユーザーがWebページのサインアップフォームまたはログインフォームを入力するのを避けるための便利な機能です。それはあなた自身のWebサイト上のユーザーセッションの簡単なセットアップを可能にしますが、私が知っている限り、それはFacebookに自分のセッションからユーザーを直接ログオンする権利を与えません(またStackoverflow )。Facebookのログアウトで確立された他のすべてのセッションを失うことを意味しているわけではありません。

0

私はこのソリューションが今あなたを助けてくれるとは思わないが、私はそれを掲示しているので、他の人には苦労しないだろう。 FB.getLoginStatusメソッドを正しく実装していないためです。 あなたがしなければならないのは、initの呼び出し後にこの方法

FB.getLoginStatus(function(response) { 
    statusChangeCallback(response); 
    }); 

を実装しています。このメソッドはstatusChangeCallbackメソッドを呼び出し、認証を行います。複数の基準について

function statusChangeCallback(response) { 
    console.log('statusChangeCallback'); 
    console.log(response); 
    // The response object is returned with a status field that lets the 
    // app know the current login status of the person. 
    // Full docs on the response object can be found in the documentation 
    // for FB.getLoginStatus(). 
    if (response.status === 'connected') { 
     // Logged into your app and Facebook. 
     testAPI(); 
    } else if (response.status === 'not_authorized') { 
     // The person is logged into Facebook, but not your app. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into this app.'; 
    } else { 
     // The person is not logged into Facebook, so we're not sure if 
     // they are logged into this app or not. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into Facebook.'; 
    } 
    } 

あなただけのFacebookのサーバーへの往復を強制的に公式ドキュメント https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

+0

このdoesnうまく動作していないようです。あなたのページに簡単なテストログイン。 FB.getLoginStatusを実行し、応答を書き留めます。別のタブで、フェイスブックからログアウトし、ページに戻ってコマンドを再実行します.APIに関する限り、まだログインしています。ページをリフレッシュし、FB.getLoginStatus-最後にページ通知を再実行します。 – mseddon

+0

はい、それは常にステータスを知るためにfbサーバーにpingを実行しませんが、fb apiを呼び出すと、それはチェックしてそのように動作します。 –

+0

実際、FB.getLoginStatusを追加パラメータ 'true'に変更することで、ステータスを直接照会して問題を解決します。 – mseddon

関連する問題