存储访问令牌

时间:2012-01-11 13:26:50

标签: php facebook facebook-authentication

我一直试图解决这个问题三天了,对于那些熟悉开放图形api的人来说,这真的很简单。我是Facebook集成的新手,但有一些PHP经验。

基本上我所要做的就是从用户那里检索以下信息并将其存储在数据库中。

Facebook用户ID: 名称 性别 电子邮件

我使用以下方法完成了用户ID,姓名和性别

$contents = file_get_contents ('https://graph.facebook.com/'.$user);
$json=json_decode($contents,true);
$userid = $json['id'];
$username = $json['name'];
$usergender = $json['gender'];
$useremail = $json['email'];

这有效,我理解我需要获得访问使用此代码完成的电子邮件的权限:

$app_id = "211665122244023";

     $canvas_page = "http://apps.facebook.com/midcitymafia/";

     $auth_url = "https://www.facebook.com/dialog/oauth?client_id=" 
            . $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&scope=email,publish_actions";

     $signed_request = $_REQUEST["signed_request"];

     list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

     $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

但是,如何获取访问令牌,然后使用它从图表中检索电子邮件?

##更新,这是我的当前代码,但仍然无法让它工作......
require 'src/facebook.php';
$app_id = "211665122244023";

     $canvas_page = "http://apps.facebook.com/midcitymafia/";

     $auth_url = "https://www.facebook.com/dialog/oauth?client_id=" 
            . $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&scope=email,publish_actions";

     $signed_request = $_REQUEST["signed_request"];

     list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

     $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);


     if (empty($data["user_id"])) {
            echo("<script> top.location.href='" . $auth_url . "'</script>");
     } else {
         $graph = json_decode(file_get_contents("https://graph.facebook.com/".$user_id . "/?accesstoken=" .$data['access_token']));
     }

$userid = $graph->id;
$username = $graph->name;
$usergender = $graph->gender;
$useremail = $graph->email;

?>

<br>

<?php echo 'ID: ' . $userid; ?>
<br>
<?php echo 'Name: ' . $username; ?>
<br>
<?php echo 'Gender: ' . $usergender; ?>
<br>
<?php echo 'Email: ' . $useremail; ?>

1 个答案:

答案 0 :(得分:1)

signed_request包含用户access_token

在您的情况下,access_token位于$data['access_token']

存储用户access_token不是最好的主意,因为它们提供的时间很短,之后就会过期。要获得永久access_token,您需要向用户请求offline_access权限(我个人不会推荐它,因为您可以在不需要offline_access的情况下完成大部分工作,在很多情况下应用{{1} }可能符合你的需要)。