4

私はfacebookで動作する私のウェブサイトのユーザログイン/ログアウトの仕組みを設計するのに少し問題があります。JS SDKの本質に混乱Facebookのイベント

特定のFacebookのイベントの動作は直感に反するようだ:。

ユーザーがログインしているすべてのページのロードの火事「auth.login」

FB.getLoginStatusは()すべてのページのロードに発射します

'auth.logout'は、ユーザーが実際にログアウトしたときにのみ起動し、 'auth.login'とは異なり、ユーザーがログインしていないときはすべてのページが読み込まれません。

私はシステムを構築したいと思います。ユーザーセッションがFacebookにログインしていると思うかどうかを判断します。ユーザーのセッションがfacebookにログインしていると思われるように設定されていても、実際にはサーバーへのajax呼び出しを実行せずにセッションを更新します。セッションとfacebook js sdkが、ユーザーがログインしているかどうかで一致している場合は、何もしないでください。ユーザーのセッションがFacebookにログインしているのに気付かず、js sdkがそうであると答えた場合は、サーバーをajax呼び出しで更新します。

現在のFacebookのログインステータスと同期するアプリケーションを作成したいと考えています。 Facebookのステータスが変わるたびに、そのアプリケーションをログイン/ログアウト(自分のセッションを更新するために私のサーバーにajax呼び出しを実行することによって)したいと思います。ユーザーがフェイスブックにログインしたときやログアウトしたときに確実に検出できないため、これは困難です。

私が持っている特に問題の1つは、ユーザーがページを読み込み、facebookにログインしたときに、auth.loginイベントとFB.getLoginStatus()イベントが同時に起動することです。

究極の質問は、このようなアプリケーションを作成するためにFacebookのイベントや一般的な戦略をどのように組み合わせる必要があるかということです。私がしようとしていることの良い例は、hulu.comのウェブサイトへのFacebookログインの実装です。これを読んでくれてありがとう!

<script> 
    window.fbAsyncInit = function() { 
    FB.init({appId: '<?=$facebook_app_id?>', 
      status: true, 
      cookie: false, 
      xfbml: true}); 

    FB.getLoginStatus(function(response) { 

     console.log('getLoginStatus'); 
     console.log(response); 

     if(response.session){ 
      if(window.module.Globals.prototype.oauth_uid != response.session.uid){ 
       //authenticated user unknown to server, update server and set session 
       window.module.VCAuth.prototype.session_login(); 
      } 
     }else{ 
      if(window.module.Globals.prototype.oauth_uid){ 
       //unauthenticated user with authenticated session, update server and unset session 
       window.module.VCAuth.prototype.session_logout(); 
      } 
     } 

    }); 

    FB.Event.subscribe('auth.login', function(response){ 
     console.log('auth.login'); 
     console.log(response); 

    }); 

    FB.Event.subscribe('auth.logout', function(response){ 
     console.log('auth.logout'); 
     console.log('response'); 
    }); 

    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 
+0

あなたはdo.Evenに似たようなことをしようとしていますが、私は正しくログアウトして彼をログアウトさせることができません。彼は自動的にログインしています。 –

答えて

5

すべてのメソッドで同じコールバックを使用することをおすすめします。このようにして、認証コードパスを1つ心配することができます。あなたは1つの主な問題だったと述べ

function authCallback(response) { 
    if(response && response.session){ 
     if(window.module.Globals.prototype.oauth_uid != response.session.uid){ 
      //authenticated user with invalid session 
      window.module.VCAuth.prototype.session_login(); 
     } 
    }else{ 
     if(window.module.Globals.prototype.oauth_uid){ 
      //unauthenticated user with authenticated session 
      window.module.VCAuth.prototype.session_logout(); 
     } 
    } 
} 

FB.getLoginStatus(authCallback); 
FB.Event.subscribe('auth.login', authCallback); 
FB.Event.subscribe('auth.logout', authCallback); 

(つまり遠くあなたが提供したコードからではありません)::

auth.loginイベントとFB.getLoginStatus(BOTH)のイベントこのような火災。

ジャストsession_logout()とsession_login()セット/コールバックはVCAuthの正しい状態が設定されていると呼ばれている次回のように、サーバーへの非同期呼び出しを行う前に解除oauth_uidことを確認してください。

注:auth.logoutはログインしたユーザーを意味しますので、 auth.logoutは、すべてのページの負荷を解雇されていませんこれは、ユーザーが右に記録されていなかった場合auth.logout発射しても意味がありませんか。?

これが役に立ちます。