Сеанс Facebook Передача js-SDK в php-SDK - PullRequest
0 голосов
/ 24 июня 2011

Я использую PHP SDK 2.1.2 и использую стандарт http://connect.facebook.net/en_US/all.js в качестве JS SDK.

Вот чего я хочу достичь:

1) Инициализируйте JS Sdk, вызовите Fb.UI с (email, user_location, user_birthday), метод: 'oauth', в ответ, если пользователь успешно дает разрешение, выполняет ajax-вызов на сервер и затем использует PHP-SDK позвонить в Graph API и получить необходимые данные. (Что ж, вы можете поспорить, что вызовите API Graph через JS SDK, но текущий сценарий требует, чтобы я использовал PHP SDK)

Проблема

Файл, который вызывается через ajax, не инициализирует сеанс, и я получаю нулевое значение, вместо этого SDK facebook в идеале должен загрузить куки и иметь активный сеанс, поскольку разрешение уже предоставлено на стороне клиента.

Мой код

Основной файл

<?php
session_start();
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
require 'src/facebook.php';

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
    'appId'  => 'xxxxxxxxxxxxxxxxxxxxxxxx',
    'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyy',
    'cookie' => true,
));

$session = $facebook->getSession();

$me = null;
// Session based API call.
if ($session) {
   try {
       $uid = $facebook->getUser();
       $me = $facebook->api('/me');
       print_r($me);
   } catch (FacebookApiException $e) {
                error_log($e);
   }
 }

?>

<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
    <title>php-sdk</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">         
    </script>
</head>
<body>

<input type="button" onclick="getpermission();"/>
<!--
  We use the JS SDK to provide a richer user experience. For more info,
  look here: http://github.com/facebook/connect-js
-->
<div id="fb-root"></div>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript">
  FB.init({
      appId   : '<?php echo $facebook->getAppId(); ?>',
      session : <?php echo json_encode($session); ?>, // don't refetch the session when   PHP already has it
      status  : true, // check login status
      cookie  : true, // enable cookies to allow the server to access the session
      xfbml   : true // parse XFBML
    });

function getpermission(){
      FB.ui({
        method: 'oauth',
        client_id: <?php echo $facebook->getAppId(); ?>,
        perms: 'email,user_location,user_birthday'
        },function(permObj) {
            if(permObj){
                $.ajax({
                        type: "POST",
                        url: 'page2.php',
                        dataType:'text',
                        success: function(data) {

                                return;
                                        },
                        error:function (xhr, ajaxOptions, thrownError){
                            alert(xhr.status);
                            alert(thrownError);
                        }    
                      });

            }
            });
        }

</script>
</body>

Файл, вызываемый через AJAX

<?php
session_start();
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
require 'src/facebook.php';

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId'  => 'xxxxxxxxxxxxxxxx',
'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyy',
'cookie' => true,
));

$session = $facebook->getSession();

$me = null;
// Session based API call.
if ($session) {
    try {
        $uid = $facebook->getUser();
        $me = $facebook->api('/me');
        print_r($me);
    } catch (FacebookApiException $e) {
          error_log($e);
    }
 }

 echo "hello";
 ?>

Если вы видите в приведенном выше примере, я должен получить весь объект / me в окне предупреждения, вместо этого я просто получаю "привет". Я не знаю, почему это не работает? Чего мне не хватает?

Сценарий: - Если я делаю перезагрузку страницы (top.location.href) после предоставления разрешений, я получаю нужные объекты, но мы пытаемся избежать перезагрузки с помощью этого механизма. Я также попытался установить желаемые заголовки P3P, потому что я думал, что может быть какая-то проблема с cookie, но он все равно не загружается.

Кроме того, я пробовал это с PHP SDK 2.1.1, 2.1.2, 3.0.1, я где-то слышал, что новые PHP-SDK еще не совместимы с JS SdK, это правда?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 июня 2011

Вы не можете установить cookie с помощью вызова AJAX: установка стороннего cookie в домене B по домену A требует, чтобы страница в домене B находилась в процессе извлечения страницы в домене A, которую вызывает ваш ajax не делает.

Я бы предложил вместо того, чтобы пытаться использовать cookie-файл, вы извлекаете токен доступа из ответа на диалог oauth (permObj->access_token, если я не ошибаюсь, и я мог бы быть) и публикуете его как параметр запроса с Ваш AJAX-вызов. Затем вы можете вызвать метод $facebook->setAccessToken со значением токена, и все должно быть установлено.

...