6

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

我偶然发现了这个线程:How to extend access token validation 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();
4

2 回答 2

7

让我们来看看你的问题:

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

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

你也应该参考这个文档:Extended Access Tokens

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

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

Facebook 已经有一个关于这个的教程:How-To: Handle expired access tokens

此外,您应该参考错误表并相应地调整您的代码。

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

往上看。

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

您不需要执行任何操作,因为 PHP-SDK 将为您处理令牌;你有没有注意到你在打电话:$user_profile = $facebook->api('/me');没有附加用户access_token

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

于 2013-01-21T08:29:13.170 回答
0

我刚遇到同样的问题,但我在您的帮助下解决了它。我正在使用 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);

}
于 2013-10-29T21:23:55.080 回答