存储访问令牌


Storing Access Token

我已经尝试解决这个问题三天了,对于那些熟悉开放图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; ?>

signed_request本身包含用户access_token

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

存储用户access_token不是一个好主意,因为它们提供的时间很短,过期时间较晚。要获得永久access_token,您需要向用户请求offline_access权限(我个人不建议这样做,因为您可以在不需要offline_access的情况下实现大多数功能,在许多情况下,应用程序access_token可能符合您的需求)。