【问题标题】:Facebook PHP SDK: getting "long-lived" access token now that "offline_access" is deprecatedFacebook PHP SDK:现在已弃用“offline_access”,因此获取“长期”访问令牌
【发布时间】:2012-06-05 19:54:10
【问题描述】:

基本问题:我希望我的应用程序能够就授权用户调用 Facebook 图形 API,即使用户不在。

例如,我希望用户 (A) 授权该应用程序,然后我希望用户 (B) 能够使用该应用程序查看有关用户 (A) 的朋友的信息。具体来说:“工作”领域。是的,我正在请求那些扩展权限(user_work_historyfriends_work_history 等)。目前,我的应用可以访问已登录用户的好友工作历史记录,但不能访问该应用其他用户的任何好友工作历史记录。

这是我已经知道的:

  • offline_access 添加到范围参数是旧方法,它 不再工作。
  • 新方法是使用“长期”访问令牌, 描述here。这些持续 60 天。
  • 我需要交换一个普通的访问令牌来获取新的扩展令牌。 FB 文档说:

    https://graph.facebook.com/oauth/access_token?
    client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN

以下是我不知道的(希望你能告诉我): 如何使用 Facebook PHP SDK 获取扩展(又名“长期”)访问令牌?目前,我的代码如下所示:

$facebook->getAccessToken();

有这样的东西吗?:

$facebook->getExtendedAccessToken();

如果不是,这是我应该做的吗?

$accessToken = $facebook->getAccessToken();
$extendedAccessToken = file_get_contents("https://graph.facebook.com/oauth/access_token?             
    client_id={$appId}&
    client_secret={$secret}&
    grant_type=fb_exchange_token&
    fb_exchange_token={$accessToken}"
    );

我已经尝试过了,但它不起作用。我收到此错误:

Warning: file_get_contents(https://graph.facebook.com/oauth/access_token? client_id=#######& client_secret=#########& grant_type=fb_exchange_token& fb_exchange_token=##########) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /...

如果我切换到 FQL 而不是图形 api,它的工作方式会有什么不同吗?我已经多次阅读 Facebook 文档,但 PHP sdk 没有完整的文档记录,我找不到任何关于它应该如何工作的示例。

【问题讨论】:

  • 答案已经在您链接的页面上 - 请再仔细阅读一遍……
  • 我想我知道您指的是什么,并且我更新了问题以显示我尝试过的内容(未成功)。如果您在谈论其他事情,请告诉我。
  • 如果你使用 SDK,为什么要使用 file_get_contents?只需使用 Facebook::api 向 Graph API 发出请求。
  • 原因是我不知道自己在做什么!这就是我发布问题的原因。我很困惑,我看到很多关于如何获取扩展访问令牌的相互矛盾的信息。我认为最安全的做法是完全按照文档进行操作......但它不起作用,我不知道为什么。
  • 此外,文档将其称为“新端点”,这让我认为它与 sdk 通常使用的不同。

标签: facebook facebook-graph-api


【解决方案1】:

我终于自己想通了。答案是相当反高潮的。似乎新创建的应用程序会自动获得 60 天的访问令牌。我不确定这是否取决于在应用程序设置的“迁移”部分中启用“depricate offline_access”设置。让它保持安全。

所以在写这篇文章的时候,你可以使用 PHP SDK 如下:$facebook->getAccessToken();

(我的应用无法按预期运行的原因与访问令牌过期无关。)

还有一件事,要使用 PHP SDK 获得长期访问令牌,您应该在 $facebook->getAccessToken(); 之前调用 $facebook->setExtendedAccessToken();

【讨论】:

  • 我使用的是较旧的 sdk。它没有你提到的 setExtendedAccessToken 功能,所以我意识到我应该切换到最新版本。现在可以了,谢谢!
  • 我对此很生气.. 我有一个疑问:您这样做是因为即使他没有登录,您也想访问用户配置文件,对吗?但是当“延长”的 60 天持久令牌到期时会发生什么?用户是否需要重新认证..?我想这不是一次很棒的经历..
  • 大声笑 - 我想这解释了为什么一切正常,直到我尝试创建一个新的应用程序,然后从中生成令牌! (使用旧应用,我不会过期,使用新应用,我会获得 60 天!)
  • 我认为 60 天是一条红鲱鱼。也许这个答案是旧的,但在$facebook->getAccessToken(); 之前调用$facebook->setExtendedAccessToken(); 就可以了!
【解决方案2】:

在上一个 Facebook PHP SDK 3.2.0 中,您有一个新功能 setExtendedAccessToken() 您必须在getAccessToken(); 之前致电

像这样:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days
$access_token = $facebook->getAccessToken();

【讨论】:

    【解决方案3】:

    如果您使用服务器端调用,实际上新创建的应用只会自动获得 60 天的访问令牌。如果您在问题中使用上面显示的客户端端点,即使是新应用程序最初仍会收到一个短期令牌。见:https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

    我遇到了与使用新端点时相同的 HTTP/1.1 400 Bad Request 错误,问题是如果您复制 Facebook 提供给您的代码并将其粘贴到您的应用程序中,参数之间实际上有空格,这意味着 url 中有不必要的空格,并且在传递给 file_get_contents() 时它不会被正确调用,即使它在粘贴到浏览器中时可以正常工作。这花了我太长时间才弄清楚。希望这对某人有帮助!这是我从新端点获取扩展访问令牌的完整工作代码(将 x 替换为您的值):

    $extend_url = "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=fb_exchange_token&fb_exchange_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    
    $resp = file_get_contents($extend_url);
    
    parse_str($resp,$output);
    
    $extended_token = $output['access_token'];
    
    echo $extended_token;
    

    【讨论】:

    • 我无法验证这一点,但这是我在问题中看到的第一个问题
    【解决方案4】:

    所选答案现已过时。以下是 Facebook 将短期令牌(在前端提供)换成长期令牌(仅限服务器)的说明:

    https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/

    Generate a Long-lived User or Page Access Token
    You will need the following:
    
    A valid User or Page Access Token
    Your App ID
    Your App Secret
    Query the GET oath/access_token endpoint.
    
    curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?  
        grant_type=fb_exchange_token           
        client_id={app-id}&
        client_secret={app-secret}&
        fb_exchange_token={your-access-token}" 
    
    Sample Response
    {
      "access_token":"{long-lived-access-token}",
      "token_type": "bearer",
      "expires_in": 5183944            //The number of seconds until the token expires
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2012-03-15
      相关资源
      最近更新 更多