К сожалению, я считаю, что это невозможно по замыслу (если вы хотите, чтобы это происходило без вмешательства пользователя).Если пользователь все еще вошел в Facebook, вы можете перенаправить страницу верхнего уровня в Facebook, и она вернет вас обратно с новым кодом (как кажется, вы уже делаете), но это возможно только из-за Facebookпеченье, что он может проверить.Если вы попытаетесь что-либо сделать с вашего сервера, он будет отклонен, поскольку этот файл 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;
}
Это предполагает, что у вас есть что-то перед этим кодом, которое обработает параметр Sign_request, если он присутствует, и присвоит значение $ token (либо явный собственный код, либо соответствующие записи в SDK).Показанный код затем можно использовать везде, где вам нужно проверить, если $ token все еще действителен, прежде чем продолжить.