2016-03-14 62 views
0

我试图建立什么本质上是使用Facebook Login日志使用户登录到网站。用户可以使用JavaScript SDK(如文档中所建议的)登录,然后我需要在服务器端获取用户详细信息,以便我可以为用户在数据库中存储日记条目(使用Facebook用户标识来标识用户)。我正尝试使用getJavaScriptHelper()在PHP SDK v5中执行此操作。Facebook的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()获得的访问令牌真的是最后的"about 60 days"文档引用?我需要将访问令牌存储在会话/ Cookie /数据库中吗?

回答

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); 
    } 
+0

我不知道我理解你的答案。你似乎做了一些有点奇怪的事情,比如检查是否存在'$ _SESSION ['fb_token']'和'$ _GET ['code']',然后从不读取它们的值。它也看起来像这个代码使用'getRedirectLoginHelper'而不是'getJavaScriptHelper'。 (并且有一个小类型 - esle)。 – Phil

+0

对不起,不解释我的回答,我会为它添加解释 –