К сожалению, я считаю, что это невозможно по дизайну (если вы хотите, чтобы это произошло без вмешательства пользователя). Если пользователь все еще вошел в систему Facebook, вы можете перенаправить страницу верхнего уровня на Facebook, и она сразу же вернет вас с новым кодом (похоже, вы уже делаете это), но это возможно только из-за Facebook. cookie, который он может проверить. Если вы попытаетесь сделать что-либо со своего сервера, оно будет отклонено, поскольку этот файл cookie не будет сопровождать запрос. То же самое касается попытки позвонить в facebook из javascript — поскольку ваш код работает в другом домене, файл cookie не будет сопровождать вызов, и Facebook отклонит его. Единственный способ, с помощью которого Facebook может узнать, кто такой пользователь и что он все еще вошел в систему, — это увидеть этот файл cookie. И единственный способ, которым это может произойти, — это если сам браузер будет перенаправлен на домен facebook.com.
Стоит также упомянуть, что Facebook заблокировал единственный логический обходной путь, то есть загрузку URL-адреса oauth в iframe. Если вы попробуете, вы увидите, что они обнаруживают, что страница загружается в iframe, и выводят страницу со ссылкой на нее, которая выполняет перенаправление верхнего уровня для выхода из фрейма. Таким образом, этот подход не только не работает, ясно, что Facebook специально сделал это невозможным как часть своей архитектуры.
Изменить: если вы хотите не полностью избегать обновления, а просто сделать так, чтобы оно происходило автоматически, когда требуется новый токен, вы можете сделать что-то вроде этого:
$status=0;
$data=@file_get_contents("https://graph.facebook.com/me?access_token=$token");
foreach ($http_response_header as $rh) if (substr($rh, 0, 4)=='HTTP') list(,$status,)=explode(' ', $rh, 3);
if ($status==200)
{
//token is good, proceed
}
else
{
//token is expired, get new one
$fburl="http://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=".urlencode('http://apps.facebook.com/yourapp/thispage.php');
echo "<html>\n<body>\n<script>top.location='$fburl';</script>\n</body>\n</html>\n";
exit;
}
Предполагается, что перед этим кодом у вас есть что-то, что обработает параметр signed_request, если он присутствует, и присвоит значение $token (либо ваш собственный явный код, либо соответствующие записи SDK). Затем показанный код можно использовать везде, где вам нужно проверить, действителен ли $token, прежде чем продолжить.
person
Floyd Wilburn
schedule
19.09.2011