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 Key
和App 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 应用(非用户)访问令牌过期的主要内容,如果未能解决你的问题,请参考以下文章