这是在 Facebook 平台上使用新的(est)Facebook PHP SDK 的画布应用程序。
我们正在使用 Facebook 教程 (https://developers.facebook.com/docs/appsonfacebook/tutorial/) 中的 PHP 示例来触发 OAuth 对话框并让测试用户访问重定向 URL。
在重定向 URL 中,我们使用 Facebook 签名请求文档页面 (https://developers.facebook.com/docs/authentication/signed_request/) 中的 PHP 示例,我们的测试用户可以成功授权应用程序。
但是,在测试用户对应用程序进行身份验证后,我们无法捕获访问令牌及其过期时间。我们可以在附加到重定向 URL 的地址栏中看到它,但它没有出现在 $_REQUEST 数组中。如果我们将 {$access_token = $facebook->getAccessToken();} 添加到重定向 URL 页面,它会显示访问令牌的值,但它显示的值不是我们单击 Show 时看到的完整令牌字符串测试用户角色页面中的令牌(我们认为这是测试用户的正确访问令牌)。
以下是附加了访问令牌的重定向 URL 示例:http: //karmakorn.com/karmakorn/alpha20/kk-fb-auth.php#access_token=126736467765%7C2.AQDavId8oL80P5t9.3600.1315522800.1-100002908746828%7CJICJwM1XP_97 7Y&expires_in=6008
这是 var_dump 为同一页面的 $ REQUEST 数组显示的内容: array(3) { [" _qca"]=> string(26) "P0-709927483-1291994912966" ["__switchTo5x"]=> string(2) " 30" ["PHPSESSID"]=> 字符串(26) "euois02ead39ijumca7nffblh2" }
我们不知道为什么 $_REQUEST 数组与附加到 URL 的值不同,更重要的是 - 如何捕获访问令牌及其到期日期。
有人可以向我们展示他们在重定向页面上运行 parse_signed_request($signed_request, $secret) 函数后如何捕获这些数据的工作示例吗?谢谢!
附加信息:
这是 A)我们的测试索引页面和 B)我们的测试重定向页面的相关代码。如果我们使用我们的文本索引页面作为重定向 url,它会陷入死循环——因为用户永远不会被识别。
A) 索引页
// Create kk-fb app instance
$facebook = new Facebook(array(
'appId' => KKFB_ID,
'secret' => KKFB_KY,
'oauth' => true,
));
$app_id = KKFB_ID;
$secret = KKFB_KY;
$canvas_auth = 'http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php';
$auth_url = "https://www.facebook.com/dialog/oauth?"
. "client_id=" . $app_id
. "&redirect_uri=" . urlencode($canvas_auth)
. "&response_type=token"
. "&scope=email,publish_stream";
$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
if (empty($data["user_id"])) {
echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
echo ("Welcome User: " . $data["user_id"]);
}
B) 重定向页面
// Create kk-fb app instance
$facebook = new Facebook(array(
'appId' => KKFB_ID,
'secret' => KKFB_KY,
'oauth' => true,
));
$app_id = KKFB_ID;
$secret = KKFB_KY;
$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();
echo "User: $user <br>";
echo "Access Token: $access_token <br>";
echo "Signed Request: $signed_request <br>";
var_dump($_REQUEST);
以下是这些回声结果显示的内容:
用户:0 访问令牌:126736467765| **秘密** 签名请求:array(3) { [" _qca"]=> string(26) "P0-709927483-1291994912966" [" _switchTo5x"]=> string(2) "30" ["PHPSESSID" ]=> 字符串(26)“frugi545cdl15gjind1fnv6pq1”}
有趣的是,当测试用户返回索引页面时,如果条件满足,我们可以得到正确的访问令牌:
欢迎用户:100002908746828 访问令牌:126736467765|2.AQBgcyzfu75IMCjw.3600.1315544400.1-100002908746828|m5IYEm976tJAkbTLdxHAhhgKmz8
显然,我们仍然缺少一些东西!?此外,我们还需要学习如何将过期时间作为变量获取,以便我们可以将这两者都存储在我们的数据库中。