2011-12-16 8 views
15

jsを使用してfb connectを使用しています。この私のコードです:私は使用していたログイン用FBログインコールバック関数は、ユーザーが既にログインしている場合には応答しません。

<script> 
    window.fbAsyncInit = function() { 
     FB.init({ 
     appId  : 'xxxxxxxxxxxxxxxx', 
     status  : true, 
     cookie  : true, 
     xfbml  : true, 
     oauth  : true 
     }); 

     FB.Event.subscribe('auth.login', function(response) { 
     obj=response.authResponse; 
     token=obj.accessToken; 
     setCookie("access_token_fb", token, '2'); 

     window.location.reload(); 
     },true); 
    }; 
    (function(d){ 
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 
    </script> 

<div class="fb-login-button" scope="email,user_checkins" >Login with Facebook</div> 

「auth.login」サブスクライブ機能では、ユーザーがFBボタンをクリックしていないときにのみ呼び出されている応答ハンドラを持っていますすでにFBにログインしている場合は、fbウィンドウにメールアドレスとパスワードを入力してください。ユーザーが既にFacebookにログインしている場合、fbダイアログが開いて閉じます。それは応答ハンドラに制御を渡しません。私はどこかでforce = "true"を読んで、ステータス変更を検出してコールバック関数を呼び出すことができます。しかし、どこに力を加えるべきかわかりません。私はそれがログインdivにあるべきだと思います。それは本当ですか、それとも他の方法がありますか?

お世話になりました。

+0

私は同じ問題を抱えています

は、ここでは最後からのコメントに答えを見つけました。私はそれがアプリケーションにリンクされている場合は、この動作を示して気づいた。助けてください。 –

+0

すべての準備ができていれば、ログインボタンをクリックしてイベントを呼び出す(ログイン後のイベントと同じ)。 –

+0

@SomnathMuluk fbログインプラグインを使用しているようですので、ログインして既にアプリに接続している場合はログインボタンは表示されません(https://developers.facebook.com/docs/reference/ plugins/login /)(そこの注釈を読んでください)。 それでもやりたいのであれば、カスタムボタンで 'auth.statusChange'イベントを購読することができます。私の答えでそれを説明した。 –

答えて

10

(その場合には、彼らは別のウィンドウでログアウト、またはなど、別の場所にアプリをDEAUTH)に耳を傾けるイベント4.変更:

私はDMCSを持っていると信じていますが問題への正しい解決策があれば、ここにアプローチする別の方法があります。カスタムログインリンクでFB.loginメソッドを使用します。

<script> 
window.fbAsyncInit = function() { 
    FB.init({ 
     appId: 'YOUR-APP-ID', 
     status: true, 
     cookie: true, 
     xfbml: true, 
     oauth: true 
    }); 
}; 

function facebookLogin() { 
    FB.login(function(response) { 
     if (response.authResponse) { 
      console.log('Authenticated!'); 
      // location.reload(); //or do whatever you want 
     } else { 
      console.log('User cancelled login or did not fully authorize.'); 
     } 
    }, 
    { 
     scope: 'email,user_checkins' 
    }); 
} 

(function(d) { 
    var js, 
    id = 'facebook-jssdk'; 
    if (d.getElementById(id)) { 
     return; 
    } 
    js = d.createElement('script'); 
    js.id = id; 
    js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
} (document)); 
</script> 

ボディマークアップ:ボタンをクリックすると

<div id='fb-root></div><!-- required for SDK initialization --> 
<a id='fb-login' href='#' onclick='facebookLogin()'>Login with Facebook</a> 

、それはFB.loginの内側にコールバック関数を実行します。

方法2:

また、FBログインボタンプラグインを使用して、あなたはauth.statusChangeに加入し、応答した利用者の状態を確認することができます。

FB.Event.subscribe('auth.statusChange', function(response) { 
    // check for status in the response 
}); 

(注)FBのログインボタンのプラグインを使用していて、ユーザーがすでにログインしてアプリに接続されている場合、何のログインボタンが表示されません(ドキュメントhereでそれを読む)

+0

私は方法2に投票します! –

+0

方法1:構文エラー: '無効なオブジェクト初期化子 ' – Richard

+0

@リチャード編集。今エラーはありません。期待どおりに動作しています。 –

2

status:trueでFB SDKを初期化すると、ユーザーからログインステータスが取得され、保存されます。その時点からFB.getLoginStatus()への呼び出し時に、FBから最新のデータを取得するのにアクセスするのではなく、FB.init()の時点で設定されていたローカルに保存された変数を参照しています - それは20分ごとに1回しかリフレッシュされません(https://github.com/facebook/facebook-js-sdk/commit/5b15174c7c9b9ea669499804d4a4c7d80771b036) - しかし、あなたはこれを行うことでリフレッシュを強制することができます。

FB.getLoginStatus(function() {...}, /*FORCE*/ true); 

これは、あなたのauth.loginイベントを発生すべきか、あなただけのあなたにもFB.getLoginStatusにそのイベント用に定義されたハンドラを渡すことができます。私はFacebookがあなたのために重い物を持ち上げるを行うせることをお勧めしたい

setTimeout(function() { 
    FB.getLoginStatus(function() {...}, /*FORCE*/ true); 
}, 10000); // poll every 10 seconds 
+0

ログイン状況がよくなってきています。ユーザーが既にFacebookにログインしている場合、fbダイアログが開いて閉じます。ログインボタンをクリックした後、応答ハンドラに制御が渡されません。 –

4

:よう

はさらにセットを移動して、この機能をポーリングすることができます。 いくつかの変更に注意してください:1. channelUrl指定、2. FB.getLoginStatusの使用3.クッキーの設定の削除。方法1

<script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : 'xxxxxxxxxxxxxxxx', 
      status  : true, 
      cookie  : true, 
      xfbml  : true, 
      oauth  : true, 
      channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html' // Channel File 
     }); 

     FB.getLoginStatus(function(response) { 
      if (response.status === 'connected') { 

       var uid = response.authResponse.userID; 
       var accessToken = response.authResponse.accessToken; 

       // Do something with the access token 


      } else { 
       // Subscribe to the event 'auth.authResponseChange' and wait for the user to autenticate 
       FB.Event.subscribe('auth.authResponseChange', function(response) { 
        // nothing more needed than to reload the page 
        window.location.reload(); 
       },true);  

       // now dynamically show the login plugin 
       $('#mydiv').show();  
      } 
     }); 


     }; 
     (function(d){ 
      var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
      js = d.createElement('script'); js.id = id; js.async = true; 
      js.src = "//connect.facebook.net/en_US/all.js"; 
      d.getElementsByTagName('head')[0].appendChild(js); 
     }(document)); 
    </script> 
+0

これはページを読み込んだ後に呼び出されます。ログインボタンをクリックした後に電話したい –

+0

ログインボタンをクリックすると電話がかかります。 FB.Event.Subscribeメソッドを参照してください。繰り返しますが、この方法は、フレームワークに重い作業をさせることです。また、subscribe関数の* 'auth.login'というあなたの要件の下では、ユーザーがfbボタンをクリックしてまだログに記録していないときFB *に " – DMCS

+0

+1非常に強力です –

0

あなたがする必要がありますauth.authStatusChangeとして

FB.Event.subscribe('auth.statusChange', function(response){ 

FB.Event.subscribe('auth.authResponseChange', function(response){  

置き換えるでもすでにログインしているかログインしているかにかかわらず、ステータスの変更をトリガーします。

おかげ

+0

ログインページを読み込むたびに、自分の機能に直接リダイレクトされます。私はログインボタンをクリックした後に私の機能に行く必要があります。 –

+0

@SomnathMulukこれを参照してください:http://developers.facebook.com/docs/reference/javascript/FB.Event。サブスクリプション/ これは、どのステータススイッチでもトリガするイベントです。どのように使用するかは、auth.statusChangeの中で、接続、承認、不明のステータスがあります。上記の詳細については、 – Hafiz

1
から

変更「のステータス:真、」へ「のステータス:偽、」私はそれはあなたがやりたいだろうと信じています。問題はstatusです:trueは、initでステータスチェックを行うため、ユーザーがボタンをクリックしたときに変更するものはありません。この作品http://www.bubblefoundry.com/blog/2011/03/the-facebook-login-button-and-logging-into-your-webapp/

+1

を参照してください。あなたのコードでテストして、この行を使用していますので、何らかの理由でそれが修正されない場合は試してみてください:FB.Event.subscribe( 'auth.statusChange'、...) –

0

FB.getLoginStatus(function(response) { 
//only works when page loads, use FB.Event.subscribe for status change  
    statusChangeCallback(response); 
    FB.Event.subscribe('auth.statusChange', function(response){ 
     //yay! do whatever here, there was a status change 
    },true); 

}); 
関連する問題