从Facebook令牌元数据响应

时间:2015-09-19 08:26:21

标签: php facebook

我正在使用以下Facebook SDK登录我的网站。我在Facebook Developers找到了源代码。

$fb = new Facebook\Facebook([
    'app_id' => $fbapp_id,
    'app_secret' => $fbapp_secret,
    'default_graph_version' => 'v2.4',
]);

$helper = $fb->getRedirectLoginHelper();

try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  $msg = 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  $msg = 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

if ( !isset($accessToken) ) {
  if ($helper->getError()) {
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
  } else {
    header('HTTP/1.0 400 Bad Request');
    $msg = 'Bad request';
  }
  exit;
}

// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
var_dump($tokenMetadata);

$_SESSION['fb_access_token'] = (string) $accessToken;

通过使用上面的代码,我得到以下响应。如何从此数组中获取'user_id'值。

string(208) "CAAQJ73gQW1kBAEeG6aOH5aPZBmULTxJPuJ8qOliC1Xn5ljjBYVHHuXuiKAn04Dz2D6hdcZBiHqhtLhe8oR1b3M78KxxUsKOj3QzQsPEnPTqxw54MK026ljHxz6EbACMdgNYgQ0jO6x6x5YGdkdIari6Nhya8ea68gTpHArl8MxexXnkZCpBXOQxZAXQ4y80YNVZCsR9X89QZDZD"
object(Facebook\Authentication\AccessTokenMetadata)#13 (1) {
  ["metadata":protected]=>
  array(7) {
    ["app_id"]=>
    string(16) "1136824023014233"
    ["application"]=>
    string(8) "example.com"
    ["expires_at"]=>
    object(DateTime)#17 (3) {
      ["date"]=>
      string(26) "2015-11-18 06:36:01.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(3) "UTC"
    }
    ["is_valid"]=>
    bool(true)
    ["issued_at"]=>
    object(DateTime)#18 (3) {
      ["date"]=>
      string(26) "2015-09-19 06:36:01.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(3) "UTC"
    }
    ["scopes"]=>
    array(2) {
      [0]=>
      string(5) "email"
      [1]=>
      string(14) "public_profile"
    }
    ["user_id"]=>
    string(17) "1020772222323227"
  }
}

3 个答案:

答案 0 :(得分:6)

我已设法使用以下

获取User Id
$getUserId = $tokenMetadata->getUserId();

答案 1 :(得分:2)

假设这是正确的班级https://github.com/facebook/facebook-php-sdk-v4/blob/5.0-dev/src/Facebook/Authentication/AccessTokenMetadata.php

$tokenMetadata->getField('user_id')

要获取所有元数据,请使用

$tokenMetadata->getMetadata()

返回所有字段的关联数组

答案 2 :(得分:2)

我使用以下代码将令牌元数据转换为数组:

$responseArray = (array) $tokenMetadataObject;
$token_metadata = $responseArray[array_keys($responseArray)[0]];

这为您提供了一个数组(在$token_metadata中),现在可以访问所有字段(此方法有点变通方法,但它有效)。您无法直接访问这些字段的原因是因为它们在对象中都是私有的,并且只能从类中访问。

如果您尝试将其转换为数组然后直接访问字段,您仍然无法使用$theArray['theIndex']的常用方法获取值,因为将私有字段转换为数组填充索引 NULL 字节,以便您无法访问它。