Это для приложения на основе холста на платформе Facebook с использованием нового (самого) Facebook PHP SDK.
Мы используем пример PHP из учебника Facebook (https://developers.facebook.com/docs/appsonfacebook/tutorial/), чтобы вызвать диалоговое окно OAuth и направить тестового пользователя на URL-адрес перенаправления.
В URL-адресе перенаправления мы используем пример PHP со страницы документации подписанного запроса Facebook (https://developers.facebook.com/docs/authentication/signed_request/), и наши тестовые пользователи могут успешно авторизовать приложение.
Однако после того, как тестовый пользователь авторизует приложение, мы не сможем зафиксировать токен доступа и срок его действия. Мы видим его в адресной строке, добавленной к URL-адресу перенаправления, но он не отображается в массиве $_REQUEST. Если мы добавим {$access_token = $facebook->getAccessToken();} на страницу URL-адреса перенаправления, она покажет значение токена доступа, но отображаемое значение не является полной строкой токена, которую мы видим, когда нажимаем Показать Токен на странице ролей тестовых пользователей (мы считаем, что это правильный токен доступа для тестового пользователя).
Вот пример URL-адреса перенаправления с добавленным токеном доступа: -100002908746828%7CJICJwM1P_97tKmqkEO5pXDCf-7Y&expires_in=6008" rel="nofollow">http://karmakorn.com/karmakorn/alpha20/kk-fb-auth.php#access_token=126736467765%7C2.AQDavId8oL80P5t9.3600.1315522800.1-100002908746828%7CJICJwM1P_97tKmqkEO5pXDCf -7Y&expires_in=6008
Вот что показывает var_dump для массива $REQUEST для той же страницы: array(3) { ["_qca"]=> string(26) "P0-709927483-1291994912966" ["__switchTo5x"] => строка (2) "30" ["PHPSESSID"] => строка (26) "euois02ead39ijumca7nffblh2" }
Мы понятия не имеем, почему массив $_REQUEST отличается от значений, добавленных к URL-адресу, и, что более важно, как получить токен доступа и дату его истечения.
Может ли кто-нибудь показать нам рабочий пример того, как они собирают эти данные после запуска функции parse_signed_request($signed_request, $secret) на странице перенаправления? Спасибо!
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Вот соответствующий код из A) нашей тестовой индексной страницы и B) нашей тестовой страницы перенаправления. Если мы используем нашу текстовую индексную страницу в качестве URL-адреса перенаправления, она застревает в бесконечном цикле, потому что пользователь никогда не идентифицируется.
А) Индексная страница
// 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"]);
}
Б) Страница перенаправления
// 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|**SECRET** Подписанный запрос: array(3) { ["_qca"]=> string(26) "P0-709927483-1291994912966" ["_switchTo5x"]=> строка(2) "30" ["PHPSESSID"]=> строка(26) "frugi545cdl15gjind1fnv6pq1" }
Интересно, что когда тестовый пользователь возвращается на индексную страницу, условие if выполняется, и мы можем получить правильный токен доступа:
Добро пожаловать, пользователь: 100002908746828 Токен доступа: 126736467765|2.AQBgcyzfu75IMCjw.3600.1315544400.1-100002908746828|m5IYEm976tJAkbTLdxHAhhgKmz8
Очевидно, мы все еще что-то упускаем!? Кроме того, нам нужно научиться получать время истечения срока действия в качестве переменной, чтобы мы могли хранить оба значения в нашей базе данных.