我正在尝试使用Facebook Login构建本质上是日记的内容,以使用户能够登录该网站。用户可以使用 JavaScript SDK 登录(如文档中的建议),然后我需要在服务器端获取用户详细信息,以便我可以将用户的日记条目存储在数据库中(使用 Facebook 用户 ID 来识别用户)。我正在尝试使用 getJavaScriptHelper()
在 PHP SDK v5 中执行此操作。
我对如何正确处理/存储访问令牌感到有些困惑。到目前为止,我有这个(为了简洁起见,我已经删掉了 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()
获得的访问令牌确实持续文档所指的"大约 60 天"?我是否需要将访问令牌存储在会话/cookie/数据库中?
您必须检查用户是否登录。 如果登录,因此我们必须在SESSION
中找到访问令牌或(我们可以将其保存在数据库中),然后我们将使用它来访问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);
}