Facebook PHP SDK v5访问令牌/工作流程

时间:2016-03-14 08:57:18

标签: php facebook facebook-javascript-sdk facebook-php-sdk

我正在尝试使用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 /数据库中存储访问令牌?

1 个答案:

答案 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);
    }