Facebook redirect_uri не распознает пользователя после OAuth - PullRequest
2 голосов
/ 14 февраля 2012

OAuth от Facebook поражает меня ... снова. У нас довольно простая система:

  1. Пользователь использует OAuth для «получения» разрешений Facebook (базовая информация о пользователе + расширенное разрешение: запись на стене)
  2. Посредством настраиваемого redirect_uri пользователь перенаправляется обратно на нашу платформу, где пользовательская информация хранится в базе данных, и пользователь также помечается как «авторизованный», используя нашу собственную систему входа в систему.

Однако проблема в том, что иногда (я повторяю: иногда ...) пользователь не распознается через $ user = $ facebook-> getUser (); запрос. Только если установлен $ user, пользователь сохраняется в базе данных, так как мы знаем только, что пользователь аутентифицирован и может использовать $ facebook-> api ('/ me');

Странно то, что после первых испытаний пользователям выдается сообщение об ошибке, но если они снова нажимают «Войти через Facebook», все идет хорошо. И снова, не все пользователи испытывают эту проблему. У меня такое ощущение, что мой код еще не «распознает» пользователя, вошедшего в систему, при выполнении всех действий по созданию учетной записи.

Действительно надеюсь, что кто-нибудь может помочь, ниже я разместил код.


    INITIATION:

    $loginUrl = $facebook->getLoginUrl(array('scope' => 'friends_relationships,publish_stream,email,user_birthday,user_location,user_checkins,user_education_history,user_photos','redirect_uri' => 'REDIRECTED_PAGE.php'));

    RETURN PAGE (REDIRECT_PAGE.PHP)

    $fbuser = $facebook->getUser();

    if ($fbuser) {
      try {
        $user_profile = $facebook->api('/me');
      } catch (FacebookApiException $e) {
        error_log($e);
        $fbuser = null;
      }
    }

    $uid = $user_profile['id'];

    // -> here's the problem: $fbuser is either 0 or not set

    if (isset($fbuser) && $fbuser != '0') 
    {
     $dbc = new DBC();
     $dbc->connect(0, true);
     $fbemailquery = $dbc->executeQuery("SELECT * FROM users WHERE fbuid = '".$uid."'");
     if(!$dbc->isResultEmpty($fbemailquery)) { 

      // USER IS KNOWN, SO LOGIN

     }
     else { 

      // NEW USER

      $firstname = $user_profile['first_name']; // etc etc
     }
     $dbc->close();
    }

1 Ответ

0 голосов
/ 16 февраля 2012

Приложения Facebook действительно хитры.Вы входите в приложение через ваш сайт напрямую?или вы используете внутреннее приложение facebook?(например, apps.facebook.com/application).Я спрашиваю вас об этом, потому что у Facebook есть другой механизм для работы с аутентификациями, в зависимости от того, находитесь ли вы на своем собственном сайте или непосредственно на facebook.com. Первый попросит вас получить код доступа, который указан в $ _REQUEST ['code']var, который вы можете позже обменять на токен доступа (с разрешениями, которые вы запрашиваете).Однако если вы заходите через facebook.com, есть подписанный запрос, отправленный через POST на URL-адрес холста вашего приложения, который вы должны декодировать, чтобы получить код доступа, который находится внутри (если пользователь уже авторизовал ваше приложение) или отсутствует (еслипользователь отклонил ваше приложение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...