Facebook PHP SDK метод getUser (), возвращающий uid даже после несанкционированного доступа к приложению из Facebook - PullRequest
2 голосов
/ 23 июня 2011

Я пишу веб-приложение, которое использует PHP SDK Facebook. Я использую метод getUser () для аутентификации пользователей, подобных этому:

    $user = $this->facebook->getUser();
    $loginUrl = $this->facebook->getLoginUrl(array(
        'scope' => 'email,publish_stream',
        'redirect_uri' => base_url() . 'index.php/welcome/create'
    ));;

    if(!$user){
        /*
         * User not authenticated, present with facebook authorize dialog
         * */
        echo "<script type='text/javascript'>window.location = '$loginUrl';</script>";
        die();

Чего я не понимаю, так это того, почему getUser () продолжает возвращать мой идентификатор Facebook, даже после того, как я удалил приложение из настроек конфиденциальности моего febeook в Facebook. Кто-нибудь знает почему?

Ответы [ 5 ]

2 голосов
/ 23 июня 2011

Это потому, что идентификатор пользователя все еще находится в сеансе!

Это в основном вызывает ошибку при выполнении вызовов с объектом me (нужен активный токен доступа или что-то в этом роде).

Один из способов преодолеть это:

try {
    $user_profile = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
    if(DESIRED_ERR_NUM && session_id()) {
        session_destroy(); // OR UNSET FB RELATED VARS ONLY
    }
    echo '<script>top.location.href = "' .  $this->facebook->getLoginUrl(array("scope"=>"publish_stream,user_about_me","redirect_uri"=>"YOUR_URL_HERE")) . '"</script>';
    exit;
}

Это НЕ рабочий код, вам нужно проверить номер ошибки И, если у вас есть сеанс, уничтожить его ИЛИ просто сбросить в нем переменные, связанные с Facebook.

Вы можете проверить, верно ли это, выполнив:

if(session_id()) {
    session_destroy();
}

(обратите внимание, что это разрушит ВСЕ в сеансе не только связанные с Facebook вещи!)

Как я уже сказал, это не рабочий код, но, надеюсь, он поможет вам начать работу (это определенно можно улучшить, добавив в класс Facebook и т. Д.).

1 голос
/ 23 февраля 2012

вы можете попробовать это:

Автор Umer Pasha:

Функция getUser () Facebook, возвращающая идентификатор пользователя после выхода из системы

Проблема кажетсянаходиться в php-sdk в basefacebook.php в строке 567

     protected function getSignedRequestCookieName() {
     return 'fbsr'.$this->getAppId();}

Этот метод возвращает имя файла cookie, который ищет SDK.Однако javascript-sdk использует префикс 'fbsr_'.Измените это на 'fbs_', и оно отлично работает.

1 голос
/ 14 января 2012

К сожалению, решение ifaour у меня не сработало.Я добавил дополнительную функцию в классе NativeFacebook:

public function clearSessionData() {
    $this->setAccessToken(null);
    $this->user = 0;
    $this->clearAllPersistentData();
}

Для простоты вы можете просто оставить ее публичной функцией.Затем в своем заявлении на улов вы можете добавить

$this->facebook->clearSessionData();

, чтобы удалить все следы предыдущих подключенных данных учетной записи Facebook.

1 голос
/ 23 июня 2011

Реализация их сайта не синхронизирована с разработкой их API.Это две отдельные линии развития.Таким образом, у них есть немало разработчиков, работающих над частью веб-сайта, и людей, работающих над SDK, и поэтому либо что-то не было должным образом передано обеим командам, либо неверное выполнение определенных требований одной из команд.Или просто изменение требований, которое затронуло одну команду, но не другую.

Это также вызывает беспокойство, поскольку это может быть средством доступа к личным данным через API, которые могут быть запрещены пользователем через веб-сайт..

0 голосов
/ 06 апреля 2013

Старый поток, но кто-то еще может его проверить.

В PHP-SDK v3.2.2 есть открытый метод для этого: destroySession ().Это не уничтожит вашу $ _SESSION, просто очистите все кэшированные данные, которые собрал класс.его в base_facebook.php

...