Facebook 应用(非用户)访问令牌过期

Posted

技术标签:

【中文标题】Facebook 应用(非用户)访问令牌过期【英文标题】:Facebook app (NOT user) access token expiration 【发布时间】:2012-02-19 00:57:42 【问题描述】:

Facebook APP 访问令牌会过期吗?这些代币不同于 USER 代币;它们是这样获得的:

https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=0&client_secret=1)

如http://developers.facebook.com/docs/authentication/ 文档的应用登录部分所述。

在什么情况下会失效?

注意:这不是关于 USER 访问令牌(已明确记录)的问题。有一个相同的问题 http://facebook.***.com/questions/7322063/does-app-login-access-token-expire 被错误地关闭为另一个关于 USER 访问令牌的问题的副本。

【问题讨论】:

【参考方案1】:

我知道导致它们失效的一种情况是,如果您使用 Facebook 开发人员工具重置应用程序密码。

我不知道使用 OAuth 方法生成 App Token 是否会导致它过期。但是,如果您扫描 Facebook 的 php SDK,您可能会注意到由 app_id 和 secret 连接而成的未过期应用令牌:

  /**
   * Returns the access token that should be used for logged out
   * users when no authorization code is available.
   *
   * @return string The application access token, useful for gathering
   *                public information about users and applications.
   */
  protected function getApplicationAccessToken() 
    return $this->appId.'|'.$this->apiSecret;
  

警告:我永远不会在客户端代码中使用它,因为它会发布您的应用程序机密。但是,在信任服务器环境中,这似乎是可行的方法。

为了对此进行测试,我使用 OpenGraph 工具擦除了我的访问令牌并输入了代码示例中的串联值。然后,我访问了我的应用的见解以验证它是否可以工作:

<APP_ID>/insights/application_active_users

【讨论】:

谢谢,它有效。但是这种获取应用访问令牌的方法是一种受保护的方法,不是公共 API 的一部分。我不能相信它不会改变并在拥有数百万用户的实时网站上使用它。 (Facebook 因公共 API 重大更改而臭名昭著,更不用说这样的事情了)。从 URL(问题中提到)获取的应用程序访问令牌似乎确实过期了;一夜之间,我开始在测试环境日志中看到异常:验证访问令牌时出错:会话已在 unix 时间 1327539600 过期。当前的 unix 时间为 1327605009。 Facebook 不太可能突然引入经过批准的 SDK 的重大更改。通常,Facebook 会提供一个路线图,用于对其认可的库进行重大更改。经常查看developers.facebook.com/roadmap。 唉,从之前的第一手经验来看,很可能见证了 Facebook API 的重大变化。我刚刚在上面提到了一个:应用程序访问令牌确实过期了,尽管文档没有说明它。更糟糕的是,返回的错误代码是 0(表示成功!?)。错误代码应被视为 API 的一部分,否则开发人员将毫无保障。顺便说一句,是否有一个明确不变的 Facebook 错误代码列表? 如前所述,您在 PHP SDK 中提到的方法甚至不是公共的,它是受保护的方法。【参考方案2】:

创建 APP_ACCESS_TOKEN 非常简单。 您可以使用您的App ID/API KeyApp secret

access_token = YOUR_APP_ID|YOUR_APP_SECRET

示例:1234587968 | bghyuifjk3438483249235903502035023504305

【讨论】:

谢谢,我知道。问题是这些令牌是否过期(以及我随后发表的评论,当它们过期时似乎不会返回错误代码)。 这不是真的,后半部分不是应用程序机密。您可能需要重新检查它。 请检查我评论上的日期。【参考方案3】:

根据Facebook documentation:

应用访问令牌是使用您的应用秘密签署的,不会 到期;如果您重新键入/重置您的应用程序,它将失效 秘密。

【讨论】:

【参考方案4】:

对我来说,答案不是找到不会过期的令牌(因为我不信任 Facebook),而是在不占用用户时间的情况下捕获过期令牌并重置。我发现了这个,并认为您可能想检查一下。

“为确保为您的用户提供最佳体验,您的应用需要准备好捕捉上述场景的错误。以下 PHP 代码向您展示了如何处理这些错误并检索新的访问令牌。

当您将用户重定向到身份验证对话框时,如果用户已经授权您的应用程序,则不会提示用户授予权限。 Facebook 将返回一个有效的访问令牌,而无需任何面向用户的对话。但是,如果用户取消了对您的应用程序的授权,那么用户将需要重新授权您的应用程序才能获得 access_token。”资源:https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/

【讨论】:

以上是关于Facebook 应用(非用户)访问令牌过期的主要内容,如果未能解决你的问题,请参考以下文章

Facebook访问令牌过期问题[关闭]

如何生成“永不过期”的 Facebook 访问令牌

为 Facebook 页面生成“永不过期”访问令牌

Facebook Oauth 2.0 访问令牌会过期吗?

在 iOS 应用程序中处理过期的访问令牌

如何在 Spring OAuth SSO 授权服务器中处理令牌过期?