PHP SDK v.3.1.1 — «Должен использоваться активный токен доступа» на простом примере

#facebook #sdk #facebook-php-sdk

#Facebook #sdk #facebook-php-sdk

Вопрос:

У меня было несколько серьезных ошибок при реализации последней версии PHP SDK и OAuth2, поэтому я разбил его на использование предоставленного примера, чтобы продемонстрировать проблему, с которой я сталкиваюсь.

Я использую этот код. Я получаю исключение OAuthException «Для запроса информации о текущем пользователе необходимо использовать токен активного доступа». Когда я нажимаю на ссылку Войти с помощью Facebook, я продолжаю получать эту ошибку, и я не подключен. Обратите внимание, что обычно это работает, когда все файлы cookie и сеансы очищены, но через пару часов, если я вернусь, это больше не работает.

Я был бы благодарен за любую помощь в этом.

Также обратите внимание, что это не на странице холста.

 <?php
ob_start();
/**
 * Copyright 2011 Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

require_once('../facebook-php-sdk/facebook.php');

include('app3.conf.inc.php');

$facebook = new Facebook(array (
            'appId' => $appConf['appID'],
            'secret' => $appConf['appsecret'],
        ));

// 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?fields=permissions');
  } 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.
try
{
    $naitik = $facebook->api('/naitik');
}
catch (Exception $ex)
{
    echo("Exception with api/naitik:n<pre>");
    var_dump($ex);
    echo("</pre>");
    die();
}

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

    <h3>Cookies</h3>
    <pre><?php print_r($_COOKIE); ?></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. В файлах cookie есть signed_request . Когда я его декодирую, ему около 6 часов.

2. У вас есть код в вашем URL? Вам нужно использовать код, чтобы получить access_token.

3. Да, после нажатия на ссылку для входа в Facebook у меня есть код в URL.

4. Я начал сбрасывать каждый вызов API, выполняемый SDK. Первый заключается в graph.facebook.com/oauth/access_token и это приводит к появлению строки ‘{«ошибка»:{«сообщение»:»Код был недействительным или истек. Сеанс истек по времени unix 1317819600. Текущее время unix — 1317836099.»,»type»:»OAuthException»}}’ (длина = 158) Он использует тот же старый код, а не код в URL. Кажется, он хранится где-то вроде файла cookie или сеанса.

5. Кажется, был файл cookie с именем ‘fbsr_ {appid}’ (там указан реальный идентификатор приложения), который содержал подписанный запрос, который, в свою очередь, содержал «код». SDK использовал это вместо последнего кода, указанного в URL. Я, похоже, исправил это, добавив unset($ _COOKIE[‘fbsr_’ . $this->getAppId()]); для очистки всех постоянных данных и вызова этого, если был задан код. Сейчас я не уверен в этом SDK.

Ответ №1:

Facebook обнаружил ошибку и принял ее для последнего SDK. Я предлагаю понизить рейтинг до одного из предыдущих в 2011 году до тех пор. Это решило мою проблему.

Ответ №2:

Похоже, вы были близки. Ниже конфигурации php для facebook я предоставляю запрос if GET, чтобы определить, вышел ли пользователь из системы. Когда они выходят из системы, срабатывает код внутри условия

unset($_COOKIE['fbsr_' . $config['appId']]);

вместо

unset($_COOKIE['fbsr_' . $this->getAppId()]);

Это казалось тренировкой как шарм.

Комментарии:

1. Вот что я смог сделать, чтобы преодолеть проблему: if(isset($_GET[‘logoff’])){ // Инициализировать сеанс. session_start(); // Сбросьте все переменные сеанса. $_SESSION = array(); // Если требуется завершить сеанс, также удалите файл cookie сеанса. if (ini_get(«session.use_cookies»)) { $params = session_get_cookie_params(); setcookie(имя_сессии_(), «, time() — 42000, $params[«путь»], $params[«домен»], $params[«безопасный»], $params[«httponly»] ); } // Наконец, уничтожьте сеанс. session_destroy(); }else{ // Получить идентификатор пользователя $user = $facebook->getUser(); }

2. Я думаю, вам также нужно уничтожить файл cookie fbsr_appid. Я понизил рейтинг до более старой версии, и у меня не было проблем. Ошибка была принята FB.