2012-10-11 103 views
3

簡單的Facebook應用程序與數據庫服務器(使用包裝器)進行通信。出於安全原因,需要檢查用戶詢問服務器是否確實是其ID的所有者(根據請求發送)。Facebook應用程序:服務器端訪問令牌驗證

爲此,服務器請求包含來自基於JavaScript SDK的Web應用程序的用戶的access_token和id。我想檢查訪問令牌的所有者和用戶的ID是否相同。第一步是從Facebook獲取訪問令牌的所有者身份。使用代碼:

class SessionValidator { 
    private $userId;   //id of user 
    private $accessToken;  //facebook user's access token 
    private $fb; 
    public function __construct($userId, $accessToken){ 
     $this->userId = $userId; 
     $this->accessToken = $accessToken; 
     $app_id = @appId; 
     $app_secret = @secret; 

     $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret)); 
     $fb->setAccessToken($accessToken); 

     $this->fb = $fb; 
    } 
    public function authUserSession(){ 
     $url = 'https://graph.facebook.com/'; 
     $data['fields'] = $this->userId; 
     $data['access_token'] = $this->accessToken; 

     $response = $this->post_request($url, $data); 

     return $response; 
    } 
    private function post_request($url, $data){ 
     return $this->fb->api('/me', 'POST', $data); 
    } 
} 

Facebook一直給予迴應:

未捕獲OAuthException:(#10)應用程序無權 這個動作

相同的反應是,如果我已刪除行:$fb->setAccessToken($accessToken);。我確定appId和appSecure是正確的。客戶端應用程序和服務器端應用程序放置在不同的主機上,但這兩個域都作爲應用程序域添加到Facebook開發人員站點上。任何想法,爲什麼我收到這個錯誤?

回答

7

問題在於你在那裏打電話!

您應該做一個GET請求,而不是請求。

此外,您的fields鍵應該是id作爲其值而不是用戶的ID。

這裏有一個固定的版本:

class SessionValidator { 
private $userId;   //id of user 
private $accessToken;  //facebook user's access token 
private $fb; 
public function __construct($userId, $accessToken){ 
    $this->userId = $userId; 
    $this->accessToken = $accessToken; 
    $app_id = @appId; 
    $app_secret = @secret; 

    $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret)); 
    $fb->setAccessToken($accessToken); 

    $this->fb = $fb; 
} 
public function authUserSession(){ 
    $url = 'https://graph.facebook.com/'; 
    $data['fields'] = 'id'; 
    $data['access_token'] = $this->accessToken; 

    $response = $this->get_request($url, $data); 

    return $response; 
} 
private function get_request($url, $data){ 
    return $this->fb->api('/me', 'GET', $data); 
} 
} 

如果你做了GET要求與fields值作爲你的User's ID$this->userId那麼它會返回一個錯誤:

(#100)未知字段:[您通過的用戶名]

編輯:這是另一個可以用來驗證用戶ID的版本。如果用戶標識與Facebook返回的用戶標識匹配,則該方法將返回true或false。如果您對返回的回覆採取其他措施,那麼這可能不適合您,並且您可以使用上述版本。

class SessionValidator { 
    private $userId;   //id of user 
    private $accessToken;  //facebook user's access token 
    private $fb; 
    public function __construct($userId, $accessToken){ 
     $this->userId = $userId; 
     $this->accessToken = $accessToken; 
     $app_id = @appId; 
     $app_secret = @secret; 

     $fb = new Facebook(array('appId' => $app_id, 'secret' => $app_secret)); 
     $fb->setAccessToken($accessToken); 

     $this->fb = $fb; 
    } 

    public function authUserSession(){ 
     $url = 'https://graph.facebook.com/'; 
     $data['fields'] = 'id'; 
     $data['access_token'] = $this->accessToken; 

     $response = $this->get_request($url, $data); 

     if($this->userId == $response['id']) { 
      return true; 
     } 
     return false; 
    } 

    private function get_request($url, $data){ 
     return $this->fb->api('/me', 'GET', $data); 
    } 
} 
+0

非常感謝。它完美的作品。 –

+0

沒問題,很高興爲你工作:)你可能想選擇這個答案btw!只需點擊此答案左上方投票按鈕下方的複選標記即可! –

相關問題