我已经开始破解一个函数,通过使用PHP通过我的网站拉入FB数据,但可以做一些关于重新认证阶段的帮助。
到目前为止,我有它,以便访问者可以通过FB进行身份验证并获得他们的数据。我的下一个挑战是尝试使重复访问工作,而不必重新验证。
<<p> 当前计划/strong>要做到这一点,我存储访问令牌我得到的第一次访问(在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或参数来进行我上面概述的调用?
你的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响应在所有调用中都不是很"标准"(甚至请求也不是完全标准化),所以有时你可能无法相信你的直觉。