Почему Facebook PHP SDK getUser всегда возвращает 0? - PullRequest
39 голосов
/ 22 июля 2011

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

Ответы [ 26 ]

23 голосов
/ 08 ноября 2012

У меня была такая же проблема, и я понял это потому, что 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;
}
5 голосов
/ 11 ноября 2011

Я столкнулся с подобной проблемой.$ 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'))}");
}

?>
4 голосов
/ 24 июля 2011

Ознакомьтесь с этой записью в блоге: http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/

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

3 голосов
/ 25 октября 2012

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

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

2 голосов
/ 11 октября 2013

Часы и часы на ветер.Ни одна из публикаций об этом на 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 голосов
/ 09 апреля 2012

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

$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 голосов
/ 29 апреля 2013

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

1 голос
/ 15 мая 2012
<code><?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); ?>

Вы

image/picture">

Ваш пользовательский объект (/ me)

<?php print_r($user_profile); ?>
Вы не подключены.

Публичный профиль Naitik

image
1 голос
/ 15 мая 2012

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

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

1 голос
/ 12 мая 2012

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

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

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

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