Facebook, Oauth, PHP и хранение access_tokens в MySQL - PullRequest
2 голосов
/ 08 ноября 2011

Я начал взламывать функцию для извлечения данных FB через мой сайт с помощью PHP, но мог помочь с некоторыми этапами повторной аутентификации.

Пока у меня это есть, чтобы посетитель мог пройти аутентификацию через FB и получить свои данные. Моя следующая задача - попытаться заставить повторные посещения работать без повторной аутентификации.

Текущий план

Для этого я сохраняю токен доступа, полученный при первом посещении (в MySQL). Когда посетитель возвращается, я извлекаю этот токен доступа из базы данных и, используя функцию cURL, пытаюсь получить контент, используя URL-адрес, например ...

$graph_url = "https://graph.facebook.com/me/home?date_format=U&limit=40" . "access_token=" . $access_token;

Затем я проверяю возвращенное содержимое на наличие ошибок. При необходимости я отправляю браузер посетителей обратно в Facebook для аутентификации по URL-адресу, подобному следующему ...

$dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $my_url . "&state=" . $_SESSION['state'] ;

(Я понимаю, что URL, используемый для первоначальной аутентификации , должен быть одинаковым при первом посещении и любых последующих, так что теперь у меня есть все переключатели в одном скрипте.)

Затем возвращается код (или токен запроса). Используя этот код, я могу затем использовать другую функцию cURL, чтобы попытаться получить новый токен доступа, используя этот новый токен запроса, используя URL-адрес, подобный следующему ...

$token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . $my_url . "&client_secret=" . $app_secret . "&code=" . $code;

Затем в теле страницы возвращается новый токен доступа, и я могу взять его, обновить локальную версию базы данных MySQL и выполнить дальнейшие запросы графа FB (используя $ graph_url выше).

Проблема

Похоже, FB возвращает мне один и тот же токен доступа при каждом вызове. В настоящее время я думаю У меня есть запись кода и что я неправильно понял поток FB / Oauth (но я, конечно, могу ошибаться!).

Так что мои вопросы ...

(1) Возможно / правильно ли для FB возвращать один и тот же токен доступа (возможно, на определенный период)?

(2) Должен ли я использовать другой / другой URL или параметры для звонков, которые я описал выше?

(3) Может кто-нибудь указать мне пример сценария (с использованием PHP PHP SDK или нет), который делает подобные вещи?

(4) Любые другие указатели, советы и т. Д.?

Я не признаюсь, что являюсь экспертом во всем этом, но я работаю над этим уже несколько недель и искал различные ресурсы для примеров, но, очевидно, где-то упускаю суть.

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

1 Ответ

1 голос
/ 09 ноября 2011

(1) Возможно / правильно ли для FB вернуть один и тот же токен доступа (возможно, на определенный период)?

Да, если вы запрашиваете токен доступа дляУже действительный сеанс пользователя, вы просто получите тот же токен, который вам вернули.

(2) Должен ли я использовать другой / другой URL или параметры для выполнения вызовов, которые я описал выше?

Ваш URL выглядит хорошо с первого взгляда.Лучший план - использовать Facebook Graph API Explorer для их проверки.

(3) Может кто-нибудь указать мне пример сценария (с использованием PHP PHP SDK или нет), которыйчто такого рода вещи?

Я могу предложить пару быстрых помощников, которые я написал для недавнего приложения, которое использует функциональность Game / Score, которую предлагает Facebook.Они могут быть более или менее полезными для вас:

// SERVER-SIDE
/**
 *  Simplified cURL function for Facebook API
 * 
 *  @param  string  $url    Properly encoded URL to cURL
 *  @param  string  $type   Expected return type
 *     
 *  @return string  $buffer Buffer of returned data (decoded if appropriate)
 *  
 *  @author Andrew Kozak  < www.andrewkozak.com >
 */
function doCurl( $url , $type='JSON' )
{
  $ch = curl_init();
  curl_setopt( $ch , CURLOPT_URL , $url );
  curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT , 10 );
  curl_setopt( $ch , CURLOPT_RETURNTRANSFER , 1 );
  $buffer = curl_exec( $ch );
  curl_close( $ch );

  if( strtolower( $type ) == 'json' )
  {
    $buffer = json_decode( $buffer );
  }    

  return $buffer;
}

/**
 *  Grab Data Thru the Graph API
 * 
 *  Structured call to the Graph API using cURL.  To grab general User info, 
 *  leave the $what parameter blank.
 * 
 *  @param  string  $token  User's access token
 *  @param  string  $what   API-specific reference to what data is requested
 *  @param  string  $who    
 * 
 *  @return string  $json   Decoded JSON object containing returned data
 * 
 *  @author Andrew Kozak  < www.andrewkozak.com >
 */
function graphDo( $token , $what='' , $who="me" , $type='JSON' )
{
  return doCurl( 
    "https://graph.facebook.com/{$who}/{$what}?access_token={$token}" , $type 
  );
}



// CLIENT-SIDE 
/** 
 *  Get User's Current Score
 * 
 *  Assumes global-scope definitions for variables:
 *    facebook_user_access_token
 *
 *  @author Andrew Kozak  < www.andrewkozak.com >
 */
facebookGetScore : function( p )
{
  var score_from_fb = '';

  $.ajax(
  {
    url: "https://graph.facebook.com/me/scores" ,
    data: 'access_token=' + facebook_user_access_token ,
    dataType: 'json' ,
    complete: function( data )
    {
      var responseText = $.parseJSON( data['responseText'] );

      score_from_fb = responseText['data']['0']['score'];

      if( p === true )
      {
        console.log( "Current score: " + score_from_fb );
      }            
    }
  });
} ,

/** 
 *  Set User's Score
 * 
 *  Passes client-side gamer score to a server-side PHP script to 
 *  set the score on Facebook without publishing the application's
 *  access token.
 *
 *  Assumes global-scope definitions for variables:
 *    facebook_user_id
 *    facebook_user_name
 *    facebook_user_access_token
 *    EXAMPLE.currentslide // Gameplay progress data
 *    facebook_application_access_token
 *
 *  @author Andrew Kozak  < www.andrewkozak.com >
 */         
facebookSetScore : function( s , p ) 
{ 
  $.ajax(
  {
    url: "http://www.EXAMPLE.com/actions/ajax/setscore" ,
    data: "id=" + facebook_user_id + "&access_token=" + facebook_user_access_token + "&name=" + facebook_user_name + "&score=" + s + "&last_seen=" + EXAMPLE.currentslide ,
    complete: function( data )
    {
      if( p === true )
      {
        console.log( data['responseText'] ); 
      }
    }        
  });
}

(4) Любые другие указатели, советы и т. Д.

Мой самый большой совет будет использовать Facebook Graph API Explorer , чтобы заранее структурировать свои звонки и регистрировать все, работая с ответами (я предполагаю, что вы используете Firebug или что-то похожее);Ответы API Facebook не совсем «стандартные» для всех вызовов (даже запросы не полностью стандартизированы), поэтому иногда вы не сможете доверять своей интуиции.

...