-1

我已经在 Facebook 开发者小组中发布了这个问题,但没有人能给出一个有竞争力的答案。我有一个使用服务器端身份验证的 Facebook 应用程序。代码如下所示:

$config = array();
  $config['appId'] = $fbconfig['appid'];
  $config['secret'] = $fbconfig['secret'];
  $config['fileUpload'] = false; // optional

  $facebook = new Facebook($config);


    //Facebook Authentication part

    $mobile = false;
    $code = false;
    if (isset($_GET["code"]) && !empty($_GET["code"]) && strlen($_GET["code"])>1){
    $code  = trim($_GET["code"]);


    }

    //MOB VAR
if (isset($_REQUEST['mob']) && !empty($_REQUEST['mob']))
    {
    mobile = true; 

    }else{

         }



    if ($mobile){
 $loginUrl = $facebook->getLoginUrl(
     array(
     'redirect_uri' => $fbconfig['baseUrl'].$loginpart,
     'scope'  => 'email,user_likes'
          )
                                    );

 $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['baseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}else{


 $loginUrl = $facebook->getLoginUrl(
            array(
            'redirect_uri' => $fbconfig['appBaseUrl'].$loginpart,
            'scope'  => 'email,user_likes'
                 )
                                    );
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['appBaseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}




if ((!isset($_GET['code']) || empty($_GET['code']) ) ) {
        echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
        exit;
    } else{
   if ($code){
    $response  =  file_get_contents($token_url);

    $params  = null;
    parse_str($response, $params);
    $access_token = $sessionKey = $AccessToken = $params['access_token'];

    if(isset($AccessToken) && !empty($AccessToken)){
    if(isset($params['expires'])){
      $ExpDate = $params['expires'];

我缩短了代码以免惹恼您。


问题

由于某种原因,代码返回短$ExpDate,可以从 3000 秒到 7000 秒。这种情况并非发生在所有用户身上,而是发生在其中 10%-15% 的用户身上。

我试过的

  • 尽管 Facebook 应该返回长期存在的 access_token,但我尝试将其与/oauth/access_token?url 进行交换。无结果:返回相同的过期时间。
  • 我试图$SERVER['HTTP_USER_AGENT']找出用户与短期 access_tokens 的共同点。没有结果:一切都不一样(它们可以来自移动设备、桌面、IOS 原生 Facebook 应用程序......)
  • 我将我的设置从隐私设置更改为每个可能的版本,多次安装、删除应用程序试图重现这种情况。没有结果:对我来说效果很好。
  • 我保存了用户的代码并尝试手动获取 access_token。我无法做到这一点,因为我忘记了代码只能使用一次。

你们怎么能帮忙

  • 如果有人具有相同的身份验证方法,请检查您的数据库。你有同样的问题吗?
  • 如果有人有想法为什么会发生这种情况,请帮助找出原因。
  • 如果我们发现这是一个错误,我们可以在 Facebook 上创建错误报告

谢谢你。

4

1 回答 1

0

你看到的行为是正确的。

您当前正在将代码交换为短期访问令牌 - 这是必需的。由于 Facebook 删除了该offline_access权限,因此获得长期访问令牌的唯一方法是将您的短期访问令牌交换为长期访问令牌。

请参阅有关删除 offline_access的文章,特别是与 OAuth 相关的场景 4。这是他们介绍长期访问令牌概念并告诉您如何获得的地方。

实现这一点的简短故事是获取您的短期访问令牌 - 比如说 AQADEADBEEF 并获取这个......

https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token=AQADEADBEEF

注意 4 个参数 grant_type、client_id、client_secret 和 fb_exchange_token。该 URL 与您获得原始访问令牌时的 URL 相同,但参数略有不同。根据需要插入您的client_idclient_secret

然后,您将获得一个过期时间更长的访问令牌——我相信是 90 天。Facebook 对任何访问令牌的长度都非常模棱两可。只有拿到了才知道有效期。长期访问令牌仍将过期,Facebook 目前没有提供更新它的方法。

于 2013-05-24T14:19:00.417 回答