Facebook签名请求不返回用户ID

时间:2014-06-08 10:56:21

标签: php facebook codeigniter

我使用提供的代码here将Facebook登录添加到我的CodeIgniter应用程序(我将其作为画布应用程序集成到FB中)。该应用程序尚未向公众开放,我正在使用我自己的帐户进行测试(该帐户在FB上具有"管理员和#34;角色)。

问题是,我没有从以下代码中获取用户ID。事实上,我只获得了一小部分数据。

以下是代码的相关部分(位于上面Git页面的libraries / facebook.php中):

public function getSignedRequest() {
    if (!$this->signedRequest) {
      if ($this->allowSignedRequest && !empty($_REQUEST['signed_request'])) {  //this condition is true
        $this->signedRequest = $this->parseSignedRequest(
          $_REQUEST['signed_request']    //long random-looking string, 180 characters
        );
      } else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
        $this->signedRequest = $this->parseSignedRequest(
          $_COOKIE[$this->getSignedRequestCookieName()]);
      }
    }
    return $this->signedRequest;
  }

上面的函数返回:

array(3) { ["algorithm"]=> string(11) "HMAC-SHA256" ["issued_at"]=> int(1402224646) ["user"]=> array(3) { ["country"]=> string(2) "rs" ["locale"]=> string(5) "en_US" ["age"]=> array(1) { ["min"]=> int(21) } } } 

即使根据文档它应该返回这样的东西:

{
  "algorithm": "HMAC-SHA256",
  "expires": 1317243600,
  "issued_at": 1317239909,
  "oauth_token": "<token>",
  "page": {
    "id": "<id>",
    "liked": false,
    "admin": true
  },
  "user": {
    "country": "in",
    "locale": "en_GB",
    "age": {
      "min": 21
    }
  },
  "user_id": "<user-id>"
}

所以缺少的内容是user_idpageexpiresoauth_token

这是parseSignedRequest函数:

protected function parseSignedRequest($signed_request) {

    if (!$signed_request || strpos($signed_request, '.') === false) {
        self::errorLog('Signed request was invalid!');
        return null;
    }

    list($encoded_sig, $payload) = explode('.', $signed_request, 2);

    // decode the data
    $sig = self::base64UrlDecode($encoded_sig);
    $data = json_decode(self::base64UrlDecode($payload), true);var_dump($data);

    if (!isset($data['algorithm'])
        || strtoupper($data['algorithm']) !==  self::SIGNED_REQUEST_ALGORITHM
    ) {
      self::errorLog(
        'Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM);
      return null;
    }

    // check sig
    $expected_sig = hash_hmac('sha256', $payload,
                              $this->getAppSecret(), $raw = true);

    if (strlen($expected_sig) !== strlen($sig)) {
      self::errorLog('Bad Signed JSON signature!');
      return null;
    }

    $result = 0;
    for ($i = 0; $i < strlen($expected_sig); $i++) {
      $result |= ord($expected_sig[$i]) ^ ord($sig[$i]);
    }

    if ($result == 0) {
      return $data;
    } else {
      self::errorLog('Bad Signed JSON signature!');
      return null;
    }
  }

无论我尝试使用自己的帐户(管理员角色)还是朋友的帐户(测试人员角色),我都会得到完全相同的回复。如果我尝试第三个帐户(根本没有角色),那么Facebook正确地说该页面不可用(因为该应用程序对公众不公开)。

有人能看到问题吗?

1 个答案:

答案 0 :(得分:1)

显然,Canvas App上没有Page数据(因为没有Page)。

关于用户ID:当然,您必须实施用户授权,否则您将无法获得任何ID。我在您的代码中看不到任何用户授权。未经授权,用户将完全匿名。例如,您可以使用JavaScript或PHP实现授权。以下是一些资源:

请注意,您不会再获得真实的用户ID,而只会获得“App Scoped ID”。有关更多信息,请参阅以下Facebook资源: