簡體   English   中英

FB社交登錄PHP-為什么人們這么難?

[英]FB social Login PHP - Why People take it as so difficult?

我在基於PHP的網站上實現FB social登錄。 我檢查了FB網站,發現它易於實施。 以下是我所遵循的方法,不確定在此是否存在任何安全問題

我使用了Facebook JS SDK方法。

如下:

var appID = 'xxxxxxxxxxxxxxx';
window.fbAsyncInit = function() {
FB.init({
  appId      : appID, // App ID
  channelUrl : '',
  status     : true,
  cookie     : true,
  xfbml      : true, 
}); 
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
    // connected
    FB.api('/me?fields=id,name,email,permissions', function(response) {
        //alert('Good to see you, ' + response.name + '.');
    });
}else{

}
});
};

function login() {
  if( navigator.userAgent.match('CriOS') ){ 
  }
  else{
  FB.login(function(response) {
      if (response.authResponse) {
          replace_login();
      } else {
          // cancelled
          alert('User cancelled login or did not fully authorize.');
      }
  },{scope: 'email,public_profile,user_friends'});
}
}

function replace_login(){
   FB.api('/me?fields=id,name,email', function(response) {
       $.ajax({
          url: "s-account",
          type: 'POST',
          data: response,
          dataType: 'json',
          beforeSend: function(){
              $("#signin_fb").button('loading');
          },
          success: function(data) {
             $("#signin_fb").button('reset');
             window.location.reload();
          },
          error: function(){
              $("#signin_fb").button('reset');
          }
       });
   });
}

在服務器端的PHP中,我通過ajax調用將用戶詳細信息(如social_id, name and email在數據庫中,並且如果數據庫操作成功,則將在username and email設置Session Variable ,並且用戶已成功登錄。

對於注銷,我正在使用自己的注銷功能銷毀網站用戶會話,並且用戶已成功注銷。

現在,安全風險在哪里? 因為如果用戶注銷,然后嘗試再次登錄,則JS SDK將通過新的響應獲得新的訪問令牌。

這整個身份驗證過程歸結為對s-account的ajax調用。 您是在POST請求中將 名稱電子郵件FB.api()發送到您的后端應用程序,並且您沒有提到,我想您沒有在服務器端使用這些詳細信息驗證訪問令牌,並且僅根據這些詳細信息進行會話。

安全問題

現在,安全性問題是您在服務器端使用了客戶端身份驗證。 用戶可以簡單地生成一個POST請求以使用諸如用戶名電子郵件地址之類的虛假響應(例如Facebook)生成s-account ,您的PHP應用程序將對用戶進行身份驗證並進行有效會話,而無需驗證詳細信息是否來自合法來源。 您的身份驗證已在此階段完全中斷,因為惡意用戶可以通過生成一個簡單的POST請求來使用任何電子郵件用戶名 s-account使用任何s-account 登錄

怎么修

Facebook在圖譜API中提供一個端點,該端點可驗證訪問令牌並返回與此訪問令牌關聯的用戶的詳細信息。 文檔中

該端點返回有關給定訪問令牌的元數據。 這包括數據,例如為其頒發令牌的用戶,令牌是否仍然有效,令牌何時到期以及應用程序對給定用戶具有哪些權限。

Fb.Login()將生成訪問令牌作為response.authResponse.accessToken和userId作為response.authResponse.userID 您需要在對s-account ajax調用中將此accessTokenuserID以及其他用戶詳細信息一起發送,然后使用以下API端點來驗證這些詳細信息是否合法。

curl -X GET "https://graph.facebook.com/v2.6/debug_token?input_token=USER_ACCESS_TOKEN_FROM_AJAX_CALL&access_token=YOUR_APP_ACCESS_TOKEN"

如果訪問令牌有效,則您將獲得以下響應,其中包含為其發出該令牌的用戶ID。

{
  "data": {
    "app_id": "YOUR_APP_ID",
    "application": "YOUR_APP_NAME",
    "expires_at": 1462777200,
    "is_valid": true,
    "scopes": [
      "email",
      "manage_pages",
      "pages_messaging",
      "pages_messaging_phone_number",
      "public_profile"
    ],
    "user_id": "THE_USER_ID_ASSOCIATED_WITH_THE_TOKEN"
  }
}

現在,您可以將此userID與在ajax調用中收到的用戶ID進行比較,並檢查詳細信息是否合法。

如何獲取您的APP_ACCESS_TOKEN

要使用debug_token API調試用戶訪問令牌,您需要使用以下API端點在服務器端生成APP訪問令牌。

curl -X GET "https://graph.facebook.com/v2.6/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=client_credentials"

這將返回您的應用訪問令牌作為響應。

{
  "access_token": "YOUR_APP_ACCESS_TOKEN_HERE",
  "token_type": "bearer"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM