【问题标题】:Facebook app (NOT user) access token expirationFacebook 应用(非用户)访问令牌过期
【发布时间】: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.stackoverflow.com/questions/7322063/does-app-login-access-token-expire 被错误地关闭为另一个关于 USER 访问令牌的问题的副本。

【问题讨论】:

    标签: facebook-graph-api access-token


    【解决方案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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2012-04-12
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多