it-swarm.com.ru

Почему Facebook PHP SDK getUser всегда возвращает 0?

Я пытаюсь работать с веб-сайтом, который требует некоторой информации от пользователя Facebook, я использую PHP и JS SDK.

У меня есть функция в PHP:

public function isLoggedOnFacebook() {
    $user = $this->_facebook->getUser();
    if ($user) {
        return $this->_facebook->api("/$user");
    }
    return false;
}

В классе, который содержит объект facebook из SDK в $this->_facebook.

Затем на блоке я делаю это:

<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
   <fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>

И среда FB JS настроена правильно (я думаю), поэтому она работает. Таким образом, пользователь получает всплывающее окно и авторизует сайт.

Проблема в том, что даже после того, как приложение было авторизовано пользователем, $ user всегда равно 0, что означает, что $facebook->getUser() всегда возвращает 0, а затем перечисляет лица пользователей, включая зарегистрированного пользователя, но если я заставлю его вызвать $facebook->api('/me') или что-то еще, то оно скину недопустимый токен исключения.

Я видел эту проблему, но я не видел решения, я понятия не имею Где проблема, и у меня заканчиваются идеи.

На странице разработчиков Facebook есть вкладка «Веб-сайт» в разделе «Приложения», где вы можете настроить URL-адрес своего сайта и домен сайта, и я думаю, что это является причиной моей проблемы, но я точно не знаю, что именно поля должны содержать.

39
fd8s0

Ответ на мою конкретную проблему заключался в том, что между версиями JS SDK и PHP SDK, которые я использовал, были несовместимости, и только их обновление решило эту проблему.

Симптом этой проблемы похож, когда он вызван множеством разных вещей, поэтому вы можете очень хорошо разбираться в различных ответах, доступных на этой странице.

0
fd8s0

У меня была такая же проблема, и я понял это потому, что SDK использует переменную $_REQUEST, а в моей среде это не так, что объединено с переменными $_GET, $_POST и $_COOKIE

Я думаю, что это зависит от версии PHP, и именно поэтому кто-то заставил ее работать, включив куки.

Я нашел этот код в base_facebook.php:

protected function getCode() {
    if (isset($_REQUEST['code'])) {
        if ($this->state !== null &&
                isset($_REQUEST['state']) &&
                $this->state === $_REQUEST['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $_REQUEST['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

И я изменил его, как вы можете видеть ниже, создав переменную $ server_info.

protected function getCode() {
    $server_info = array_merge($_GET, $_POST, $_COOKIE);

    if (isset($server_info['code'])) {
        if ($this->state !== null &&
                isset($server_info['state']) &&
                $this->state === $server_info['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $server_info['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}
23
Norberto Yoan

Я столкнулся с подобной проблемой. $ facebook-> getUser () возвращал 0 и иногда возвращал действительный идентификатор пользователя, когда пользователь фактически не вошел в систему, что приводило к ошибке Fatal Oauth, когда я пытался сделать вызовы Graph API. Я наконец решил эту проблему. Я не знаю, правильно ли это, но это работает. Вот код:

<?php
include 'includes/php/facebook.php';
$app_id = "APP_ID";
$app_secret = "SECRET_KEY";
$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

$user = $facebook->getUser();

if ($user <> '0' && $user <> '') { /*if valid user id i.e. neither 0 nor blank nor null*/
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) { /*sometimes it shows user id even if user in not logged in and it results in Oauth exception. In this case we will set it back to 0.*/
error_log($e);
$user = '0';
}
}
if ($user <> '0' && $user <> '') { /*So now we will have a valid user id with a valid oauth access token and so the code will work fine.*/
echo "UserId : " . $user;

$params = array( 'next' => 'http://www.anujkumar.com' );
echo "<p><a href='". $facebook->getLogoutUrl($params) . "'>Logout</a>";

$user_profile = $facebook->api('/me');
echo "<p>Name : " . $user_profile['name'];
echo "<p>";
print_r($user_profile);

} else {/*If user id isn't present just redirect it to login url*/
header("Location:{$facebook->getLoginUrl(array('req_perms' => 'email,offline_access'))}");
}

?>
5
anujkk

Проверьте это сообщение в блоге: http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/

Выпущен новый JS SDK - https://developers.facebook.com/blog/post/525

4
Syed I.R

Вам нужно убедиться, что ваше приложение настроено на получение параметра кода из строки запроса, а не uri_fragment, это можно установить на странице приложений facebook apps>settings>permissions.

Это сделало это для меня с помощью $facebook->getLoginUrl(), чтобы предоставить URL для входа в систему.

3
Stephen Creasey

Часы и часы на ветер. Ни одна из публикаций об этом на Stack Overflow или других сайтах не дала решения моей проблемы. Наконец я вошел в библиотечный код и выяснил, где именно он умирает.

На моей машине разработки, которая использует XAMPP для Windows, я продолжал получать 0 для входа в систему, в то время как мой тестовый сервер работал бы должным образом. После осознания того, что исключение выдается, но скрыто, я поместил $ e-> getMessage () в base_facebook.php, который указал, что у меня ошибка SSL. Следующий пост, HTTPS и SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата, CA в порядке , привел меня к решению.

Решение:

В base_facebook.php добавьте следующее перед curl_exec ($ ch):

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Вероятно, вам следует заключить вышеприведенные флаги в те флаги, которые вы используете, чтобы определить, находитесь ли вы в режиме разработки, потому что вам не нужна эта строка в производственной системе. Например:

if ( getenv( 'environment' ) === 'development' ) {
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
}
2
levans

После отладки через base_facebook.php я обнаружил, потому что каким-то образом я потерял свой файл .crt, токен доступа навсегда недействителен. Убедитесь, что ваш fb_ca_chain_bundle.crt доступен по адресу: https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

2
Ian

Проверьте ваш конфигурационный массив . Убедитесь, что при установке значений вы используете правильные кавычки.

$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional

Это работает.

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

Это прямое копирование/вставка с веб-сайта http://developers.facebook.com/docs/reference/php/ и НЕ работает из-за странных волнистых кавычек.

длинный ответ заключается в том, что ваш хэш для «проверки» подписи приложения не подходит для правильной проверки, потому что секрет приложения не возвращает действительное значение (на самом деле он ничего не возвращает) ... так что функция hash_hmac возвращает неправильное значение, которое не соответствует должным образом, и т. д ...

2
Jared Mark

$facebook->getUser() вернет 0, если пользователь не аутентифицирует приложение. 

используйте $facebook->getLoginUrl, чтобы получить URL для аутентификации приложения.

1
Dino

У меня была точно такая же проблема с моим приложением в Facebook, и я, наконец, понял это после 2 дней разочарования. Оказалось, что проблема с редиректом-uri в getLoginUrl()! если он не соответствует зарегистрированному домену приложения через facebook, они возвращают ошибку, и пользователь возвращается как 0 (значение пользователя по умолчанию).

1
Nick

У меня была та же проблема с getUser(), она возвращает 0 в IE 8. Я нашел решение после некоторого исследования. Перейдите по ссылке ниже. Это работает как шарм. 

http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/

1
Arun Karnati

Я проверял и проверял долгое время, Теперь я нашел причину.

Пожалуйста, войдите в систему для разработчиков приложений, в настройки -> Advance -> Миграции -> Отказаться от автономного доступа - -> отключено .

Вы найдете, что $ facebook-> getUser () будет работать.

еще одна вещь. лучше добавить домен, когда новый класс Facebook;

$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();    
1
Bob Jeey

Попробуйте это в своем фрагменте кода: Если при выполнении условия вы будете перенаправлены на Facebook, то войдите в систему, и я надеюсь, что к тому времени вам будет хорошо, но не забудьте использовать новые библиотеки php SDK

if(($facebook->getUser())==0)
{
 header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
 exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}
1
Faizan Qadri

После нескольких отчаянных часов вот что вызвало ту же проблему на моем сервере: если вы используете SSL, убедитесь, что порт 443 не заблокирован ! Я открыл порт в прошлом году, но оказалось, что мой веб-хостер как-то недавно сделал сброс.

1
Ingo

я решил эту проблему, так как столкнулся с той же проблемой . Просто зайдите на developers.facebook.com/apps и перейдите к своему приложению нажмите кнопку EDIT APP

Если вы отметили «Приложение на Facebook» и ввели URL-адрес холста Приложение не будет работать вне Facebook Будет работать под apps.facebook.com/

просто уберите этот чек, у меня сработало

1
Hemen Ashodia
<?php

require 'facebook.php';

// Create our application instance
// (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

// 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();
}

// This call will always work since we are fetching public data.
$naitik = $facebook->api('/naitik');

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h1>php-sdk</h1>

    <?php if ($user): ?>
      <a href="<?php echo $logoutUrl; ?>">Logout</a>
    <?php else: ?>
      <div>
        Login using OAuth 2.0 handled by the PHP SDK:
        <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
      </div>
    <?php endif ?>

    <h3>PHP Session</h3>
    <pre><?php print_r($_SESSION); ?></pre>

    <?php if ($user): ?>
      <h3>You</h3>
      <img src="https://graph.facebook.com/<?php echo $user; ?>/picture">

      <h3>Your User Object (/me)</h3>
      <pre><?php print_r($user_profile); ?></pre>
    <?php else: ?>
      <strong><em>You are not Connected.</em></strong>
    <?php endif ?>

    <h3>Public profile of Naitik</h3>
    <img src="https://graph.facebook.com/naitik/picture">
    <?php echo $naitik['name']; ?>
  </body>
</html>
1
R' Zone

Это хорошие предложения, но то, что у меня сработало, это на самом Facebook. После многократного рефакторинга кода я понял, что это проблема с настройками на Facebook.
Следующие шаги решили мою проблему.

1.) В разделе «Основные»> «Приложение на Facebook» ... я отменил выбор, хотя вы можете оставить его, если хотите 

2.) В разделе «Разрешения»> «Конфиденциальность» -> «Публично»

Разрешения> Токен авторизации -> установить в строку запроса

3.) В разделе «Дополнительно» -> Аутентификация> Тип приложения -> Интернет

Третий шаг - это тот, который действительно все исправил, но не совсем уверен, почему, хотя, надеюсь, это поможет

0
isaacewing

Убедитесь, что вы вызываете эту API-функцию Facebook getUser перед любым выводом, потому что она использует переменные сеанса и файлы cookie. Заголовки не могут быть отправлены/прочитаны правильно, если вы сделали.

0
Markus Zeller

Facebook-> getUser () вернет 0, когда нет вошедшего в систему пользователя. (Https://developers.facebook.com/docs/reference/php/facebook-getUser/)

Чтобы решить эту проблему, SDK Facebook JS предоставляет токен доступа для успешного входа в систему, который можно использовать с SDK Facebook PHP. 

Приведенный ниже javascript проверит, существует ли уже логин Facebook и авторизовано ли ваше приложение Facebook:

FB.getLoginStatus(function($response) {
    if ($response.status === 'connected') {
        var uid = $response.authResponse.userID;
        var accessToken = $response.authResponse.accessToken;
        _accessServer(uid, accessToken);

    } else if ($response.status === 'not_authorized') {
        _loginPopup();

    } else {
        _loginPopup();
    }
});

Функция _accessServer открывает еще один запрос на ваш сервер, отправляя токен доступа. 

Функция _loginPopup должна открывать всплывающее окно входа в Facebook, запрашивая соответствующие разрешения для пользователя, чтобы «разрешить доступ» к вашему приложению. 

Затем приложение PHP должно передать токен доступа в API Facebook:

$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();

https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/

Надеюсь, это поможет. 

0
Henry Tseng

Я также провел много часов, глядя на это, и также нашел решение. Может быть, не для вас, но, похоже, есть некоторая проблема с $ _SERVER ['QUERY_STRING'], поэтому вам нужно установить его в массив $ _REQUEST.

Я использовал codeigniter и обнаружил, что следующий код над загрузкой библиотеки работает.

parse_str ($ _ SERVER [ 'QUERY_STRING'], $ _ REQUEST);

    parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
    $config = array(); 
    $config["appId"] = "63xxxxx39";
    $config["secret"] = "dexxxx3bf";
    $this->load->library('facebook',$config);

    $this->user = $user = $this->facebook->getUser();
    if ($user) {

        try {
                // Proceed knowing you have a logged in user who's authenticated.
                $user_profile = $this->facebook->api('/me');
                //print_r($user_profile);exit;
        } catch (FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
                $user = null;
        }
        $logout = $this->facebook->getLogoutUrl();
        $this->fb_logout = $logout;
        $this->fb_user = $user_profile;

    } else {
        $login = $this->facebook->getLoginUrl(array("scope"=>"email","redirect_uri"=>"http://domain/login/login_fbmember/"));
        $this->fb_login = $login;
    }

}
0
karmafunk

Эта проблема действительно странная. Я обнаружил, что проблема заключалась в статическом массиве $ CURL_OPTS в base_facebook.php.

Попробуйте отредактировать это из этого:

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
  );

в

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 
  );
0
Michelangelo

Если этот вопрос все еще актуален для людей, я хотел бы внести свои 2 цента, поскольку я изо всех сил пытался заставить вещи работать.

Прежде всего, попробуйте SDK, который подойдет вам, будь то PHP или JS. По сути, они оба делают одно и то же, просто JS может справиться с этим немного более элегантно (с помощью всплывающего диалога, а что нет). Там есть много различных учебных пособий, руководств и примеров! Мне потребовалась неделя, чтобы найти 1, который подходит мне и который я действительно мог бы использовать. Как только вы нашли фрагмент кода, который работает с SDK, который вы планируете использовать, пришло время изменить код в соответствии с вашими потребностями.

Как только я закончил свой код, я начал его тестировать. Я заметил, что выполняю свой код на localhost, и я тоже не получаю результатов от своих массивов. Чтобы ответить на ваш вопрос: загрузите свой код в (суб) домен и попробуйте снова. Мой код работал все время, но из-за того, что у меня не было его в сети, он не работал. Если вы уже получили его в Интернете, тогда мой ответ не будет вам полезен.

Извините, если такая небольшая история на самом деле не предназначена для SO, но она может помочь людям.

Удачи!

0
Edwin Lambregts

Если вы используете новый SDK 3.1.1 и JS, вам нужно добавить новую переменную в процедуру FB.init, которая называется 

oauth : true чтобы использовать новый протокол OATH 2.0! Затем обновите кнопку входа в систему, когда разрешения не разрешены, используйте область вместо перми

0
Sascha Heim
    if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       // do logic
    } else {
       $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
       header('Location:' . $loginUrl);
    }

вот как я исправил свою проблему, теперь он возвращает мне детали профиля пользователя для дальнейшей обработки. (это была такая головная боль)

0
R T

Добавление этой строки решило эту проблему для меня в IE9:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.
0
psycho brm

getUser() и PHP-SDK молча завершаются ошибкой, если _REQUEST напоминает глобальные переменные, сбрасываемые http-сервером из-за неправильной конфигурации. Я использовал неправильно настроенный nginx и после отслеживания кода ~ 3 часа решил эту проблему путем изменения конфигурации vhost.

Я написал комментарий о решении здесь: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

Надеюсь поможет.

0
edigu