我正在尝试使用Facebook Login构建基本上是日记的内容,以使用户能够登录该站点。用户可以使用JavaScript SDK登录(如文档中所示),然后我需要在服务器端获取用户详细信息,以便我可以在数据库中存储用户的日记条目(使用Facebook用户ID识别用户) )。我试图在PHP SDK v5中使用getJavaScriptHelper()
来执行此操作。
我对如何正确处理/存储访问令牌感到困惑。到目前为止,我有这个(为了简洁,我已经删除了try
/ catch
位:
$fb = new Facebook\Facebook([
'app_id' => $APP_ID,
'app_secret' => $APP_SECRET,
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getJavaScriptHelper();
$accessToken = $helper->getAccessToken();
if (isset($accessToken)) {
$oAuth2Client = $fb->getOAuth2Client();
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
$fb->setDefaultAccessToken($longLivedAccessToken);
$response = $fb->get('/me');
$userNode = $response->getGraphUser();
$name = $userNode->getName();
echo $name;
}
这似乎工作正常,直到我离开页面一段时间(可能的会话到期问题?),回来刷新页面;当我这样做时,我发现已经抛出了This authorization code has expired.
异常。
我的问题是:如何避免此问题,并确保通过getLongLivedAccessToken()
获得的访问令牌确实持续到文档引用的"about 60 days"?我是否需要在会话/ cookie /数据库中存储访问令牌?
答案 0 :(得分:1)
您必须检查用户是否登录。如果登录,我们必须在SESSION
中找到访问令牌或(我们可以将其保存在db中),然后我们将使用它来访问facebook图。
如果用户未登录,我们必须生成具有我们想要用来访问数据的权限的访问链接。在我们生成链接后,我们将用户重定向到Facebook以获取代码以从中生成访问令牌。当用户允许您的应用访问他的数据Facebook时,使用名为CODE
$fb = new Facebook\Facebook([
'app_id' => $APP_ID,
'app_secret' => $APP_SECRET,
'default_graph_version' => 'v2.5',
]);
$helper = $fb->getRedirectLoginHelper();
if(isset($_GET['code']) || isset($_SESSION['fb_token'])){
$accessToken = $helper->getAccessToken();
if (isset($accessToken)) {
$_SESSION['fb_token'] = (string) $accessToken;
$oAuth2Client = $fb->getOAuth2Client();
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
$fb->setDefaultAccessToken($longLivedAccessToken);
$response = $fb->get('/me');
$userNode = $response->getGraphUser();
$name = $userNode->getName();
echo $name;
}
} esle{
$_permissions = array(
'public_profile',
'user_friends',
'email',
'user_about_me');
$canvasLink=callback_url_in_your_app;
$helper = $this->_fb->getRedirectLoginHelper();
header('location:'. $helper->getLoginUrl($canvasLink, $permissions);
}