токен доступа, полученный с помощью javascript SDK, кажется недействительным при переходе на php

Я получаю токен доступа через SDK javascript и передаю его на сервер через windows.location:

<script src='https://connect.facebook.net/en_US/all.js'></script>
<!-- Load javascript facebook connector -->
<script>
    FB.init({
            appId : '<?=$app_id;?>',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml : true // parse XFBML
    });
</script>
<script type="text/javascript">
    function getToken(){
    FB.login(function(response) {
        if (response.authResponse) {
            var access_token = response.authResponse.accessToken;
            window.location="<?=$_SERVER['PHP_SELF'];?>?accessToken="+access_token;
        } else {
            return false;
        }
    }, {scope:'user_likes,friends_likes'});
}
</script>

PHP-код:

<?php
  $app_id = 'MY_APP_ID';
  $app_secret = 'MY_APP_SECRET';
  $page_id= 'MY_PAGE_ID';

  if(isset($_GET['accessToken'])){
  // Run fql query
  $fql_query_url = 'https://graph.facebook.com/'
. '/fql?q=SELECT+uid+FROM+page_fan+WHERE+page_id='.$page_id.'+AND+uid+IN+(SELECT+uid2+FROM+friend+WHERE+uid1=me())&'.$_GET['accessToken'];
  echo $fql_query_url;
  $fql_query_result = file_get_contents($fql_query_url);
  $fql_query_obj = json_decode($fql_query_result, true);

  //display results of fql query
  foreach($fql_query_obj as $v1){
    foreach($v1 as $v2){
        $x++;
    }
}
echo "You have ".$x." friends who 'like' us";

}

Когда я повторяю $fql_query_url и пропускаю URL-адрес в браузере, API-интерфейс facebook отвечает

{
   "error": {
      "message": "An access token is required to request this resource.",
      "type": "OAuthException",
      "code": 104
   }
}

Что я делаю не так? Я ДЕЙСТВИТЕЛЬНО получаю токен доступа, но он кажется недействительным?


person Jeroen Swets    schedule 12.03.2012    source источник
comment
Попробуйте проверить токен доступа на странице developers.facebook.com/tools/lint и проверьте, действует там.   -  person DMCS    schedule 12.03.2012
comment
Кроме того, НЕ передавайте токен доступа в качестве параметра GET; он может попасть на любые сторонние сайты, с которых вы добавляете контент, и может стать огромной дырой в безопасности.   -  person Igy    schedule 12.03.2012
comment
Когда я проверяю токен доступа из параметра GET, он проверяет, включая правильные разрешения. Но запрос FQL не возвращает значение... Когда я использую тот же запрос с токеном доступа, запрошенным через API графа, он работает. Когда приложение заработает, я передам токен доступа через POST. Я думаю, что это будет достаточно безопасно?   -  person Jeroen Swets    schedule 12.03.2012


Ответы (1)


Вам не хватает access_token в фактическом запросе, поскольку вы просто добавляете access_token к URL-адресу, фактически не называя этот параметр. Добавьте access_token= перед добавлением $_GET['accessToken'] к URL.

Это действительно здорово, когда ваш источник доступен для чтения, чтобы обнаружить такие вещи:

$query = <<<FQL
SELECT uid FROM page_fan WHERE page_id = {$page_id} AND uid IN (
  SELECT uid2 FROM friend WHERE uid1 = me()
)
FQL;
$fql_query_url = 'https://graph.facebook.com/fql?q=' . rawurlencode($query);
$fql_query_url .= '&access_token=' . rawurlencode($_GET['accessToken']);

Кстати, передавать access_token через параметры GET очень плохо, старайтесь избегать этого.

person Juicy Scripter    schedule 12.03.2012
comment
Спасибо, решил проблему! И я буду использовать POST в финальном сценарии. - person Jeroen Swets; 12.03.2012