Приложение Facebook не работает в IE (перенаправление на URL-адрес обратного вызова хоста) - PullRequest
0 голосов
/ 11 августа 2011

У меня есть файл с именем fbmain.php, который выполняет все части аутентификации facebook. И у меня есть кнопка в файле index.php, которая передает данные в файл .php
Это всего лишь пример

//fbmain.php : do all facebook authentication parts

//index.php
      <?php
           include_once "fbmain.php";
       ?>
<form enctype="multipart/form-data" action="http://myserver/a/a.php" method="POST">
     //Some codes 
     <input type="submit" value="Upload"/>
</form>

В файле .php я должен снова включить fbmain.php, так как здесь я делаю вызов API.

  //a.php
<?php    
    include_once "fbmain.php";

        //some codes            
            try{            
                $me = $facebook->api('/me?access_token='. $token); 
                print_r($me);               
            } catch(FacebookApiException $e){
                echo "Error:" .$e;
            }
?>

Это приложение отлично работает в браузере Firefox, но не работает в IE (когда пользователь нажимает кнопку «Загрузить», он перенаправляет пользователя на URL-адрес обратного вызова Canvas хоста).

Я попытался поместить приведенные ниже коды вверху каждого файла (fbmain.php, index.php, a.php). Но это все еще не работает?

Сначала я попробовал это

header('P3P: CP=HONK');
ob_start();

Тогда я попробовал это

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');    
ob_start();

Но в IE ничего не работает.
Кто-нибудь может мне помочь?

// файл fbmain.php

<code><?php
    //header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
    header('P3P: CP="CAO PSA OUR"');
    ob_start();
    //facebook application
    //set facebook application id, secret key and api key here
    $fbconfig['appid' ] = "MY_APP_ID";      
    $fbconfig['api'   ] = "MY_API_KEY";
    $fbconfig['secret'] = "MY_APP_SECRET";

    //set application urls here
    $fbconfig['baseUrl']    =   "http://MYSERVER/uploader/index.php"; //http://thinkdiff.net/demo/newfbconnect1/iframe;
    $fbconfig['appBaseUrl'] =   "http://apps.facebook.com/approne"; //http://apps.facebook.com/thinkdiffdemo;

    $uid            =   null; //facebook user id

    try{
        include_once "facebook.php";
    }catch(Exception $o){
        echo '<pre>';
        print_r($o);
        echo '
'; } // Создать наш экземпляр приложения. $ facebook = новый Facebook (массив ( 'appId' => $ fbconfig ['appid'], 'secret' => $ fbconfig ['secret'], 'cookie' => правда, )); // Аутентификация в Facebook $ session = $ facebook-> getSession (); $ loginUrl = $ facebook-> getLoginUrl ( массив ( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'электронная почта, publish_stream, status_update, user_photos' ) ); if (! $ session) { echo " top.location.href = '$ loginUrl'; "; выход; } if ($ session) { пытаться { $ uid = $ facebook-> getUser (); // Имеет проблему с загрузкой } catch (FacebookApiException $ e) { echo " top.location.href = '$ loginUrl'; "; выход; } } $ Sign_request = $ _REQUEST ['Sign_request']; $ secret = $ fbconfig ['secret']; $ data = parse_signed_request ($ signature_request, $ secret); $ fan_page_id = $ data ['page'] ['id']; $ admin_check = $ data ['page'] ['admin']; // Получить идентификатор страницы поклонника function parse_signed_request ($ signature_request, $ secret) { list ($ encoded_sig, $ payload) = взорваться ('.', $ signature_request, 2); // декодируем данные $ sig = base64_url_decode ($ encoded_sig); $ data = json_decode (base64_url_decode ($ payload), true); if (strtoupper ($ data ['алгоритм'])! == 'HMAC-SHA256') { error_log («Неизвестный алгоритм. Ожидаемый HMAC-SHA256»); вернуть ноль; } // проверка подписи $ Ожидаемый_сиг = hash_hmac ('sha256', $ полезная нагрузка, $ secret, $ raw = true); if ($ sig! == $ Ожидаемый_сиг) { error_log ('подпись JSON с плохой подписью!'); вернуть ноль; } вернуть $ data; } function base64_url_decode ($ input) { возвращать base64_decode (strtr ($ input, '-_', '+ /')); } ?>

1 Ответ

1 голос
/ 11 августа 2011

Я сталкивался с подобной проблемой в IE раньше, когда пользовательская сессия не сохранялась на стороне сервера. Чтобы обойти это, я добавил скрытое поле в формы, обслуживаемые IE, содержащие signed_request.

<input type='hidden' name='signed_request' value='VALID_SIGNED_REQUEST' />

Но это решение должно работать с параметром code или путем передачи токена авторизации и последующего использования его для восстановления серверной части сеанса пользователя. Вы также можете попробовать сохранить свой собственный сеансовый файл cookie.


Я вижу, что вы используете pre v3 PHP SDK. Поэтому вы должны попробовать добавить скрытое поле:

<input type='hidden' name='session' value='<?php echo json_encode($session); ?>' />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...