我使用提供的代码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_id
,page
,expires
和oauth_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正确地说该页面不可用(因为该应用程序对公众不公开)。
有人能看到问题吗?
答案 0 :(得分:1)
显然,Canvas App上没有Page数据(因为没有Page)。
关于用户ID:当然,您必须实施用户授权,否则您将无法获得任何ID。我在您的代码中看不到任何用户授权。未经授权,用户将完全匿名。例如,您可以使用JavaScript或PHP实现授权。以下是一些资源:
请注意,您不会再获得真实的用户ID,而只会获得“App Scoped ID”。有关更多信息,请参阅以下Facebook资源: