#php #codeigniter #facebook-graph-api
#php #codeigniter #facebook-graph-api
Вопрос:
Я использую модифицированную версию php-sdk версии 3.0.0, пример кода на github.com/facebook в рамках CodeIgniter в качестве вспомогательного средства.
Моя проблема в том, как указано в названии: когда я нажимаю на привязку выхода (предоставленную $Facebook->getLogoutUrl()
), я перенаправляюсь обратно на ту же страницу и получаю исключение OAuthException:
Fatal error: Uncaught OAuthException: Error validating access token: The session is invalid because the user logged out. thrown in [...]/base_facebook.php on line 959
Когда я обновляю, он загружает привязку «login», как обычно. Что происходит при этом обновлении / возврате, чего не происходит при первоначальном перенаправлении?
Я понимаю, что это ограниченная информация, но из-за проблемы я думаю, что это может быть простым решением.
РЕДАКТИРОВАТЬ: Этот пост кажется актуальным: http://forum.developers.facebook.net/viewtopic.php?id=71219
В частности, эта строка:
setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');
Однако я не уверен, как это реализовать и по-прежнему использовать $facebook->getLogoutUrl();
.
Заранее спасибо и просто дайте мне знать, если потребуется дополнительная информация.
Ответ №1:
У меня была такая же проблема, и я чуть не вырвал себе волосы. Однако после некоторого исследования выясняется, что проблема заключается в вредоносном файле cookie. Эта строка при выходе из системы должна это исправить:
setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');
Обязательно добавьте ‘.’ перед именем домена, если используются поддомены.
Я надеюсь, что это поможет!
Комментарии:
1. Да, я также сталкивался с этим на форумах Facebook для разработчиков. Источник: forum.developers.facebook.net/viewtopic.php?pid=273884#p273884
Ответ №2:
Как и предлагалось, я попытался:
setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');
Это не сработало. Что я сделал, так это просто скопировал код примера из fb:
// Get User ID
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
Средняя часть, с помощью которой if try get user_profile, является тестом для получения профиля пользователя, и если это не удается, идентификатор пользователя будет сброшен. Это сделает последнюю часть с getLoginUrl () и getLogoutUrl() правильной.
Я действительно считаю, что установка cookie более правильная, чем повторная попытка запроса и проверка, не сработает ли он… но поскольку setcookie не работал, у меня не было выбора : (
Глупый facebook, который возвращает токен с этим $user = $facebook->getUser();
, когда пользователь фактически выходит из системы.
Надеюсь, это поможет тем, кто в этом нуждается.
Ответ №3:
Судя по вашей ошибке, ваш веб-сайт все еще пытается подключиться к Facebook с помощью SDK. При запуске функции выхода, предоставляемой Facebook, обязательно очистите все имеющиеся у вас сеансы или хранилище, которые запускают вызовы Facebook.
Вполне вероятно, что они не очищаются до того, как вы попытаетесь выйти из Facebook, и именно поэтому он по-прежнему думает, что у вас есть соединение, но затем отлично работает при обновлении.
Комментарии:
1. Похоже, в этом проблема. Я надеялся, что есть более простой способ справиться с этим, чем создать свой собственный URL для выхода (хотя это не так уж сложно). Почему сеанс не будет очищен при перенаправлении с facebook.com для моего домена, но это было бы при обновлении?
Ответ №4:
В итоге я сделал следующее:
$facebook->getLogoutUrl(array('next' => site_url('logout')));
- Затем в контроллере ‘logout’:
$_SESSION = array();
$this->load->view('myoriginalview');
При выходе из системы значение redirect_uri строки запроса URL facebook для выхода из системы устанавливается на перенаправление на контроллер ‘logout’, который затем очищает сеанс и загружает представление, в котором кнопка выхода существовала в первую очередь. Все работает нормально. Теперь мне просто нужно выяснить, как обрабатывать сеанс с истекшим сроком действия, в отличие от пользователя, вышедшего из системы -_-
Редактировать:
Что я сделал сейчас, так это аннулировал cookie надлежащим образом, как описано на facebook developers forum. Я действительно хотел бы, чтобы их документация была лучше и описала это для их PHP SDK.