由于本文没有回答问题(How to get user access token?),我想问一下如何获取用户访问令牌。
我已经拥有了应用访问令牌,很简单。我还看到最新的php sdk Base_facebook类中有一个getUserAccesstoken函数,但它没用,因为最终你只获得了app访问令牌。
这是我的身份验证流程:用户进入粉丝页面应用程序,在某些时候,他必须授权权限:
$facebook = new Facebook(array(
'appId' => $app_id,
'secret' => $secret,
'cookie' => true
));
$user = $facebook->getUser();
if($user == 0) {
$login_url = $facebook->getLoginUrl($params = array('scope' => "publish_stream", 'redirect_uri' => "https://www.facebook.com/pages/PAGENAME/PAGE-ID?sk=app_APP-ID0&app_data=af"));
echo ("<script> top.location.href='".$login_url."'</script>");
}
这很好,app_data“af”param设置为返回fanpage应用程序内的页面。
因为我意识到,当我删除应用程序并返回到auth页面时,仍然会设置用户cookie($ user),因此不会再次要求用户提供权限。
出于这个原因,我也想检查权限,因此我需要用户访问令牌
try{
$permissions = $facebook->api("/me/permissions", 'GET', array('access_token' => "$access_token" ));
}
catch (Exception $e) {echo ("<script> top.location.href='".$login_url."'</script>"); }
if( array_key_exists('publish_stream', $permissions['data'][0]) ) {
// Permission is granted!
} else {
echo ("<script> top.location.href='".$login_url."'</script>");
}
所以我尝试了服务器端auth示例(https://developers.facebook.com/docs/authentication/server-side/),但当然这不起作用,因为你无法从应用程序内部读取$ _REQUEST,所以我会卡在这里。 - 你们如何检查应用程序内的权限?
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$my_url = "YOUR_URL";
session_start();
$code = $_REQUEST["code"];
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "https://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
. $_SESSION['state'];
echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$graph_url = "https://graph.facebook.com/me?access_token="
. $params['access_token'];
$user = json_decode(file_get_contents($graph_url));
echo("Hello " . $user->name);
}
else {
echo("The state does not match. You may be a victim of CSRF.");
}
丹尼尔,TIA和欢呼声
请参阅Facebook Developer Docs中有关服务器端身份验证的部分:https://developers.facebook.com/docs/authentication/server-side/
或者您可以使用混合客户端 - 服务器身份验证:http://developers.facebook.com/blog/post/534/