处理访问令牌的 Facebook PHP SDK

Posted

技术标签:

【中文标题】处理访问令牌的 Facebook PHP SDK【英文标题】:Facebook PHP SDK dealing with Access Tokens 【发布时间】:2013-01-03 10:21:39 【问题描述】:

我已经搜索了很多不同的答案,但仍然对我应该如何处理 facebook 访问令牌感到有些困惑。 我遇到的主要问题之一是由于我的浏览器中存储了哪些信息。例如,我登录应用程序,令牌过期,除非我清除浏览器中的 cookie/应用程序设置,否则我无法再次登录。

我偶然发现了这个帖子:How to extend access token validity since offline_access deprecation

这向我展示了如何通过 php 创建扩展访问令牌。

我的问题是:

1.我需要将访问令牌存储在任何地方吗?

2.访问令牌过期或失效时会发生什么?目前,当短期访问权限过期时,我的应用程序就会停止工作。

3. 我有什么方法可以处理它们以检查它们是否已过期? 我正在使用 php sdk 并且基本上使用了标准 if( $user )... 像这样:

require 'sdk/src/facebook.php';

  $facebook = new Facebook(array(
  'appId'  => 'XXXXXXXXXXXXXXXXXXXXX',
  'secret' => 'XXXXXXXXXXXXXXXXXXXXX',
));

  $user = $facebook->getUser();

  if( $user )
    try
        $user_profile = $facebook->api('/me');
     catch (FacebookApiException $e) 
    error_log($e);
    $user = null;
    
  

  if (!$user)

    $params = array(
    'scope' => 'email',
    );

    $loginUrl = $facebook->getLoginUrl( $params );
        echo '<script type="text/javascript"> 
                window.open("'. $loginUrl .'", "_self"); 
                </script>';
                exit;

  
     if( $user )

    $access_token = $facebook->getExtendedAccessToken();     

     $get_user_json = "https://graph.facebook.com/me?access_token=" 
       . $access_token;

// Rest of my code here...

我还应该做些什么来处理令牌?

。我应该在页面之间传递访问令牌还是可以像这样在每个页面的顶部再次调用它:

$facebook = new Facebook(array(
  'appId'  => 'XXXXXXXXXXXX',
  'secret' => 'XXXXXXXXXXXX',
  'redirect_uri' => 'http://localhost:8000/',
));
     $token = $facebook->getExtendedAccessToken();

【问题讨论】:

从我上次查看 Facebook API(去年)开始,您需要在它失效时获取一个新的访问令牌。您不需要在页面之间传递令牌,但我相信每次调用 API 都需要签名。 @Tebc 感谢您的回答。你知道兑换扩展代币后该怎么做吗?我一直遇到一个问题,几个小时后,在加载页面时突然出现 (!$user) 导致永远无法登录,除非浏览器被清除。有什么办法可以解决这个问题? 【参考方案1】:

让我们来看看你的问题:

我需要将访问令牌存储在任何地方吗?

这取决于您的应用程序。首先问问自己,当用户在场(未登录您的应用)时,您是否需要代表用户执行操作? 如果答案是,那么您需要扩展用户令牌,这可以使用 PHP-SDK 通过在您拥有有效的用户会话时调用此方法来完成:setExtendedAccessToken()

你也应该参考这个文件:Extending Access Tokens

访问令牌过期或失效时会发生什么? ... 有没有办法我应该处理它们以检查它们是否 过期了吗?

这是代码中的 catch 子句派上用场的地方,而 facebook 示例仅记录错误 (error_log($e);) 你应该处理它!

Facebook 已经有关于此的教程:How-To: Handle expired access tokens。

您还应该参考Errors table 并相应地调整您的代码。

我还应该做些什么来处理令牌?

见上文。

我应该在页面之间传递访问令牌还是可以 在每一页的顶部再次调用它

您不需要做任何这些,因为 PHP-SDK 会为您处理令牌;您是否注意到您正在调用:$user_profile = $facebook-&gt;api('/me'); 而没有附加用户 access_token

SDK 会从末尾添加它,因此您不必担心。

【讨论】:

【参考方案2】:

我刚刚遇到了同样的问题,但我在您的帮助下解决了它。我正在使用 php-sdk 连接到 Facebook API,所以我只是做了这个。

$facebook = new Facebook(array(
          'appId'  => 'API_ID', 
          'secret' => 'SECRET',
        ));

// Get User
$user = $facebook->getUser();

// Verifing if user is logged in.
if ($user) 
    try 
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
     catch (FacebookApiException $e) 
    error_log($e);
    $user = null;
    


// Verify if user is logged in, if it is... Save the new token.
if($user)

   // Request the access_token to the 
   $access_token = $facebook->getAccessToken()

   // Saving the new token at DB.
   $data = array('access_token' => $access_token);
   $this->db->where('userid',$user);            
   $this->db->update('facebook', $data);


【讨论】:

以上是关于处理访问令牌的 Facebook PHP SDK的主要内容,如果未能解决你的问题,请参考以下文章

使用 php sdk 在 facebook 中获取访问令牌时出错

使用 Facebook php sdk 访问相册/照片时,“请求此资源需要访问令牌”

在 Python 中使用访问令牌通过 XMPP 发送 Facebook 消息

注销后facebook访问令牌仍然有效

从 Facebook Graph API 获取访问令牌

Facebook SDK - 以编程方式获取访问令牌