Подтвердить что ты не робот

Почему PHP 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, а затем отображает лица пользователей, включая зарегистрированного пользователя, но если я позвоню ему, t24 > или что-то еще, тогда он выведет исключение недопустимого токена.

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

У меня была та же проблема, и я понял, что это потому, что 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;
}

Ответ 3

У меня возникла аналогичная проблема. $facebook- > getUser() возвращал 0, а иногда возвращал действительный идентификатор пользователя, когда пользователь фактически не вошел в систему, что привело к ошибке Fatal Oauth, когда я пытался совершать вызовы графического 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 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

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

Это сделало для меня использование $facebook->getLoginUrl() для предоставления URL-адреса для входа.

Ответ 6

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

$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 возвращает неверное значение, которое не соответствует должным образом и т.д.

Ответ 7

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

Ответ 8

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

На моей машине разработки, которая использует 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 );
}

Ответ 9

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

Войдите в приложения для разработчиков, в настройках 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();    

Ответ 10

Попробуйте это в своем фрагменте кода: если условие true, вы будете перенаправлены на 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";
}

Ответ 11

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

Ответ 12

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

ЕСЛИ у вас есть чек "Приложение на facebook" и ввели в него URL холста приложение не будет работать на стороне facebook будет работать под apps.facebook.com/

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

Ответ 13

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

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

Ответ 14

<?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 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>

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

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

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

Я надеюсь, что это поможет.

Ответ 19

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

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

Нижеприведенный 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/

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

Ответ 20

Добавление этой строки разрешило эту проблему для меня в 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.

Ответ 21

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

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

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

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

Удачи!

Ответ 22

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

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

Ответ 23

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

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

2.) В разделе "Разрешения" > "Конфиденциальность" → "Общедоступно"

Разрешения > Auth Token → set to Query String

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

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

Ответ 24

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

Ответ 25

Я также много часов смотрел на это, а также нашел решение. Возможно, не для вас, но кажется, что есть проблема с $_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 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;
    }

}

Ответ 26

Эта проблема действительно странная. Я обнаружил, что проблема была в статическом массиве $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 
  );