-1

我試圖使用Facebook的JavaScript SDK讓我的應用程序連接到用戶的Facebook帳戶。Facebook登錄按鈕 - 如何在嘗試登錄前檢查我們是否已登錄?

是否有一個簡單的方法來檢查我的應用程序是否已經連接到Facebook之前運行代碼連接它?它必須重新加載頁面,以便用戶可以真正看到他們通過Facebook登錄,但是如果我做了location.reload();在最後它會進入一個無限循環,因爲這個代碼在頭文件中,並且它會再次運行。標題在每個頁面上,因此重定向到別的地方都無濟於事。

的JS做一個Facebook登錄按鈕的工作,大部分來自Facebook的一步步引導代碼:

<script> 
function statusChangeCallback(response) { 
    console.log('statusChangeCallback'); 
    console.log(response); 
    if (response.status === 'connected') { 
     testAPI(); 
    } else { 
     document.getElementById('status').innerHTML = 'Please log ' + 'into this app.'; 
    } 
} 

window.fbAsyncInit = function() { 
    FB.init({ 
     appId: '(my app id)', 
     cookie: true, 
     xfbml: true, 
     version: 'v2.8' 
    }); 

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

}; 
(function (d, s, id) { 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) return; 
    js = d.createElement(s); 
    js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk/debug.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
}(document, 'script', 'facebook-jssdk')); 

function testAPI() { 
    console.log('Welcome! Fetching your information.... '); 
    FB.api('/me', function (response) { 
     console.log('Successful login for: ' + response.name); 
     document.getElementById('status').innerHTML = 
      'Thanks for logging in, ' + response.name + '!'; 
    }); 
    get_fb_info(); 
} 

function get_fb_info() { 
    FB.api('/me', 'GET', {fields: 'first_name,last_name,name,email,id,picture'}, function (response) { //add email, 
     console.log("FB NAME: " + response.name); 
     console.log("FB EMAIL: " + response.email); 

     data_string = 'fb_id=' + response.id + '&f_name=' + response.first_name + '&l_name=' + response.last_name + '&name=' + response.name + '&email=' + response.email + '&picture=' + response.picture; 
     $.ajax({ 
      type: "POST", 
      url: "ajax_fb_login.php", 
      data: data_string, 
      success: function (data) { 
       console.log(data); 
       //location.reload(); only has to happen once 
      } 
     }) 
    }); 
} 
</script> 

謝謝:)

+0

在FB.init參數中添加'status:true',以便SDK實際檢查當前的登錄狀態。 – CBroe

回答

2

根據官方文檔,類似下面應該做的絕招:

FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
    // the user is logged in and has authenticated your 
    // app, and response.authResponse supplies 
    // the user's ID, a valid access token, a signed 
    // request, and the time the access token 
    // and signed request each expire 
    var uid = response.authResponse.userID; 
    var accessToken = response.authResponse.accessToken; 
    } else if (response.status === 'not_authorized') { 
    // the user is logged in to Facebook, 
    // but has not authenticated your app 
    } else { 
    // the user isn't logged in to Facebook. 
    } 
}); 

FB.getLoginStatus()允許您確定用戶是否登錄到Facebook和已經驗證您的應用程序。有三種可能的狀態爲用戶:

  1. 用戶登錄到Facebook和已經驗證您的 應用程序(連接)
  2. 用戶登錄到Facebook上,但尚未驗證您的 應用程序(NOT_AUTHORIZED)
  3. 用戶要麼沒有登錄到Facebook或明確註銷你的應用程序 ,所以它不會嘗試連接到Facebook和 因此,我們不知道他們是否已驗證您的應用程序 (不知道)
+0

我試過了,但是我得到一個錯誤「Uncaught ReferenceError:FB is not defined」 – ioan

+0

你究竟在哪裏試圖調用FB對象?你能用邏輯更新你的原始代碼來獲得登錄狀態嗎? –

+0

我想把我在我的帖子中的整個代碼放在else塊中,這樣如果它已經連接,它就不會執行任何操作。我也嘗試把它放在window.fbAsyncInit = function(){},但它然後說它的對象{狀態:「未知」,authResponse:null}並沒有真正的工作 – ioan