Facebook服务器端身份验证返回短生命access_token

时间:2013-05-11 15:37:59

标签: php facebook facebook-graph-api facebook-php-sdk facebook-authentication

我已经在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应该返回长期存在的访问权限 试图与/oauth/access_token?网址交换它。没有 结果:它返回相同的过期时间。
  • 我试图抓住$SERVER['HTTP_USER_AGENT']找出内容 用户常见的是短生活access_tokens。没有 结果:一切都不一样(他们可以来自移动设备, 桌面,IOS原生Facebook应用....)
  • 我将设置从隐私设置更改为每个可能的版本,安装,删除应用程序多次尝试重现这种情况。没有结果:对我来说它完美无缺。
  • 我保存了用户的代码并尝试手动获取access_token。我无法做到这一点,因为我忘记了代码只能使用一次。

你们如何帮助

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

谢谢。

1 个答案:

答案 0 :(得分:0)

您所看到的行为是正确的。

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

请参阅有关OAuth的removal of offline_access具体方案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目前无法续订。