Facebook,Oauth,PHP以及在MySQL中存储access_tokens

时间:2011-11-08 16:48:29

标签: php mysql facebook oauth token

我已经开始破解使用PHP通过我的网站获取FB数据的功能,但可以对重新认证阶段提供一些帮助。

到目前为止,我已经拥有它,以便访问者可以通过FB进行身份验证并获取他们的数据。我的下一个挑战是尝试重复访问,而无需重新进行身份验证。

当前计划

为此,我存储了第一次访问时获得的访问令牌(在MySQL中)。当访问者返回时,我从数据库中检索此访问令牌并使用cURL函数尝试使用类似于...的URL获取内容。

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

然后我检查返回的内容是否有错误。如有必要,我会通过这样的网址将访问者浏览器发送回Facebook进行身份验证...

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

(我了解原始身份验证时使用的网址必须在第一次访问和后续访问时都是相同的,所以我现在已经将所有开关都放入了脚本中。)

然后返回代码(或请求令牌)。使用此代码,我可以使用另一个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 db版本并进一步生成FB图形请求(使用上面的$ graph_url)。

问题

看起来FB在每次通话时都会向我返回相同的访问令牌。我目前我有代码写,而且我误解了FB / Oauth流程(但我当然可能是错的!)。

所以我的问题是......

(1)FB是否有可能返回相同的访问令牌(可能是一段时间)?

(2)我是否应该使用其他/不同的网址或参数进行上述呼叫?

(3)任何人都可以指向一个示例脚本(使用Facebook PHP SDK或不使用它)吗?

(4)还有其他指示,提示等吗?

我并不自称是这方面的专家,但我现在已经开展了几个星期的工作并搜索了各种资源以供例子,但显然在某处忽略了这一点。

提前致谢。 皮特。

1 个答案:

答案 0 :(得分:1)

  

(1)FB是否有可能返回相同的访问令牌(可能是一段时间)?

是的,如果您要为已经有效的用户会话请求访问令牌,您只需获得返回给您的相同令牌。

  

(2)我是否应该使用其他/不同的网址或参数拨打上面列出的电话?

您的网址一目了然。最好的计划是使用Facebook的Graph API Explorer来检查它们。

  

(3)任何人都可以指向一个示例脚本(使用Facebook PHP SDK或不使用它)吗?

我可以为最近使用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或类似的东西); Facebook的API响应在所有调用中都不是“标准”(即使请求没有完全标准化),因此您可能无法信任您的直觉。