簡體   English   中英

Facebook,Oauth,PHP並在MySQL中存儲access_tokens

[英]Facebook, Oauth, PHP and storing access_tokens in MySQL

我已經開始嘗試使用PHP通過我的網站獲取FB數據的功能,但是可以在重新認證階段提供一些幫助。

到目前為止,我已經有了它,以便訪客可以通過FB進行身份驗證並獲取其數據。 我的下一個挑戰是嘗試使重復訪問有效,而不必重新進行身份驗證。

當前計划

為此,我存儲了第一次訪問時獲得的訪問令牌(在MySQL中)。 當訪問者返回時,我從數據庫中檢索了此訪問令牌,並使用cURL函數嘗試使用類似...的URL獲取內容。

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

然后,我檢查返回的內容是否有錯誤。 如有必要,我會通過這樣的URL將訪客瀏覽器發送回Facebook進行身份驗證...

$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)誰能指出我一個執行此類操作的示例腳本(是否使用Facebook PHP SDK)?

(4)還有其他指針,技巧等嗎?

我不認為自己是這方面的專家,但是我已經為此工作了幾個星期,並從中搜集了各種資源作為示例,但顯然在某些地方沒有抓住重點。

提前致謝。 皮特。

(1)FB是否有可能/有權返回相同的訪問令牌(可能在設定的時間段內)?

是的,如果您要為一個已經有效的用戶會話請求訪問令牌,則只需獲得返回給您的相同令牌。

(2)我應該使用其他/不同的URL或參數進行上面概述的呼叫嗎?

您的網址一目了然。 最好的計划是使用Facebook的Graph API Explorer進行檢查。

(3)誰能指出我一個執行此類操作的示例腳本(是否使用Facebook PHP SDK)?

我可以提供我為最近使用Facebook提供的Game / Score功能的應用程序編寫的快速幫助程序。 這些可能對您有所幫助:

// 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或類似產品); Facebook的API響應在所有調用中都不十分“標准”(即使請求未完全標准化),因此您有時可能無法相信自己的直覺。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM