【问题标题】:Facebook server-side authentication returns short-living access_tokenFacebook 服务器端身份验证返回短暂的 access_token
【发布时间】:2013-05-11 15:37:59
【问题描述】:

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

你们怎么能帮忙

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

谢谢。

【问题讨论】:

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


【解决方案1】:

您看到的行为是正确的。

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

请参阅removal of 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 目前不提供更新它的方法。

【讨论】:

  • Yervand,我严重怀疑您是否阅读了我的回答。您不会将短期访问令牌(您正在获取)交换为长期访问令牌。这不在您发布的文字墙上。您的评论很粗鲁,您的文字问题墙不简洁,并且您大胆地驳回了您免费收到的答案。考虑你的礼仪。
  • 我已经扩展了我的答案以帮助澄清一些概念 - 如果您想参与建设性对话,很高兴这样做。
  • 亲爱的安迪,你读过这一段吗'尽管 Facebook 应该返回长期存在的 access_token,但我试图用 /oauth/access_token 交换它?网址。没有结果:它返回相同的过期时间。'。如果您已经阅读了整个问题,试图帮助您不得分,您就会明白我已经按照您所说的做了。
  • 代码在哪里?您的 $token_url 字符串都不是长期访问令牌。它们都用于将您的 $code 交易为短期访问令牌。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2015-06-10
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多