Facebook SDK токены доступа и AJAX - PullRequest
0 голосов
/ 11 октября 2018

Я следовал Facebook SDK для PHP-документов и создал два файла, login.php и fb-callback.php со всей логикой поиска в fb-callback.php.Когда я делаю это, все работает нормально.

Но я хочу переместить логику поиска в get-posts.php и вызвать ее через ajax из fb-callback.php.Когда я делаю это, я не могу получить токен доступа.Я получаю сообщение об ошибке, описанное ниже: «Токен доступа: неверный запрос».

Я зарегистрировал оба файла fb-config.php и get-posts.php как допустимые URI перенаправления OAuth.Итак, как мне получить правильные параметры для get-posts.php?

Вот все связанные файлы:

login.php

<?php
require_once "config.php";

$redirectURL = 'https://' . $_SERVER[ 'SERVER_NAME' ] . '/r/fb-callback.php';
$permissions = ['email','user_photos','user_posts'];
$loginUrl = $helper->getLoginUrl($redirectURL, $permissions);
?>

<a href='<?php echo $loginUrl; ?>'>
<img src='continue-with-facebook.png'>
</a>
?>

config.php

<?php
if( !session_id() ) {
    session_start();
}

require_once '/home/bitnami/vendor/autoload.php';

$fb = new Facebook\Facebook([
  'app_id' => '---',
  'app_secret' => '---',
  'default_graph_version' => 'v3.1',
  ]);

$helper = $fb->getRedirectLoginHelper();
?>

fb-callback.php

<?php
require_once("config.php");
?>
<html>
<head>
  <script type='text/javascript' src='jquery.js'></script>
  <script>
    var $j = jQuery.noConflict();

    $j(document).ready(function () {

      $j.ajax({
        type: "GET",
        url: "get-posts.php",
        cache: false,
        success: function (html) {
          setTimeout(function () {
            $j('#updateDiv').html(html);
          }, 1000);
        }
      });
    });
  </script>
    </head>
    <body>
        <div id='updateDiv'><img src='spinning.gif' alt='processing...'></div> 
    </body>
</html>

get-posts.php

<?php
require_once("config.php");

// get the posts for this user id
try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo __LINE__ . ' Access Token: Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo __LINE__ . ' Access Token: Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

if (! isset($accessToken)) {
  if ($helper->getError()) {
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
  } else {
    header('HTTP/1.0 400 Bad Request');
    echo __LINE__ . ' Access Token: Bad request';
  }
  exit;
}

...

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вот фактический код, который работает с пояснениями к тому, что пришлось изменить ниже:

fb-callback.php

<?php
require_once("config.php");

try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo __LINE__ . ' Access Token: Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo __LINE__ . ' Access Token: Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

if (! isset($accessToken)) {
  if ($helper->getError()) {
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
  } else {
    header('HTTP/1.0 400 Bad Request');
    echo __LINE__ . ' Access Token: Bad request';
  }
  exit;
}

$get = "?accessToken=" . $accessToken;
?>
<html>
<head>
  <script type='text/javascript' src='jquery.js'></script>
  <script>
    var $j = jQuery.noConflict();

    $j(document).ready(function () {

      $j.ajax({
        type: "GET",
        url: "get-posts.php<?php echo $get; ?>",
        cache: false,
        success: function (html) {
          setTimeout(function () {
            $j('#updateDiv').html(html);
          }, 1000);
        }
      });
    });
  </script>
    </head>
    <body>
        <div id='updateDiv'><img src='spinning.gif' alt='processing...'></div> 
    </body>
</html>

get-posts.php

<?php
require_once("config.php");

$fb->setDefaultAccessToken($_GET['accessToken']);

...

Так что изменилось?Во-первых, мне нужно было получить код доступа в fb-callback.php, а не в get-posts.php.Поэтому я переместил логику для получения кода доступа и проверки на наличие ошибок обратно в fb-callback.php.Затем я добавил логику для передачи собранного токена в строку параметров URL-адреса AJAX.(Ищите «$ get» в двух местах: один раз, где я устанавливаю значение, и один раз, когда я присоединяю его к URL-адресу AJAX.)

В get-posts.php я удалил код, который запрашивает FacebookAPI для токена доступа.Вместо этого я просто устанавливаю токен доступа на основе того, что было передано из fb-config.php через GET в параметре с именем «accessToken» с помощью функции setDefaultAccesstoken () из Facebook PHP SDK.

Как отмечено в другом месте,вы можете продолжать передавать значение токена доступа через GET, REQUEST или $ _SESSION на страницу за страницей, если вы поддерживаете сеанс и информируете Facebook через функцию setDefaultAccessToken () на каждой последующей странице.

0 голосов
/ 28 октября 2018

Ответ в комментариях, но на самом деле есть лучшие способы.


Во-первых, чтобы ответить на ваш вопрос напрямую, проблема в том, что «код» передан в fb-callback.phpне был передан в скрипт, который вызывает $helper->getAccessToken()

Документы для этой функции (в https://developers.facebook.com/docs/php/FacebookRedirectLoginHelper/5.0.0) состояния

Попытки получить токен доступа из авторизацииcode. Этот метод отправляет запрос API Graph и возвращает ответ. Если в этом процессе произошла ошибка, будет выдано исключение FacebookSDKE. Исключение FacebookSDKExx также будет выдано в случае сбоя проверки CSRF.

ЕслиВ параметре code в URL не может быть найден код авторизации, этот метод возвращает ноль.

Следует отметить еще два момента:

  • «Состояние»(токен подделки сайтов) является частью сеанса, вам не нужно явно передавать его, если вы находитесь в одном домене, однако вам может потребоваться session_start() в login и get-posts scripts В функции getAccessToken есть параметр, который должен быть URL-адресом ORIGINAL

Очень просто

  1. Добавить session_start () к сценарию входа иget-posts.php
  2. Измените fb-callback.php так, чтобы он был похож на

.

<?php
require_once("config.php");
$code = $_GET['code'];   // warning: add validation code exists, sanitise etc.
?>
<html>
<head>
  <script type='text/javascript' src='jquery.js'></script>
  <script>
    var $j = jQuery.noConflict();

    $j(document).ready(function () {

      $j.ajax({
        type: "GET",
        url: "get-posts.php?code=<?php echo $code; ?>",
        cache: false,
        success: function (html) {
          setTimeout(function () {
            $j('#updateDiv').html(html);
          }, 1000);
        }
      });
    });
  </script>
    </head>
    <body>
        <div id='updateDiv'><img src='spinning.gif' alt='processing...'></div> 
    </body>
</html>

(Примечание: я ненавижу встроенный PHP - этотолько для примера)


Тем не менее: то, что вы должны делать, это передавать токен доступа между функциями, а не код oAuth.То, как вы это сделали выше (передача кода oAuth), является одноразовым;однако вы можете позвонить get-posts во второй / третий / четвертый раз, и это сработает, если у вас будет первый токен доступа.

1) Выполните обмен токенами в fb-callback.php вверху (это быстро, не нужно вращаться), возьмите токен (который библиотека FB хранит в переменной / cookie сеанса, или вы можете сделать это).Сделай сам), а затем покажи HTML-страницу со спиннером и вызовом AJAX.

2) Сделай обмен токенами в fb-callback.php вверху (это быстро, не нужно спиннер), возьми токен (какую библиотеку FB хранит в переменной / cookie сеанса, или вы можете сделать это самостоятельно), а затем быстро перенаправить на другую страницу, которая показывает счетчик и выполняет вызов AJAX.

Важное замечание, которое следует отметить в обоих случаях:вы передаете токен доступа;в get-posts.php отметьте «есть ли у меня токен доступа; если нет - покажите кнопку входа; если да - позвоните в Facebook».

...