我们有一个音频博客网站,可以配置为在用户创建新博客条目时发布指向用户Facebook时间线的链接。
为此,我们让用户在设置Facebook帐户链接时授权我们的应用。我们获得 publish_stream , offline_access 和 manage_pages 权限(稍后会详细介绍)。
所有代码都在C#中,但这些原则适用于任何语言,因为它是我们关注的 Facebook API 的工作方式。我们使用 OAuth 2 和图谱API 来实现所有这些目标。
因此,我们使用应用ID 和机密获取应用访问令牌,并使用该令牌发布到用户的时间轴,工作正常(因为他们已经授权我们的应用程序执行此操作)。我们还可以查询Graph API并获取赞,朋友以及各种其他数据。
现在出现问题:
我们的一些用户希望将更新发布到他们自己的时间段以及他们管理的网页的时间轴。理论上这很简单:您使用此URL查询用户管理的页面的API:https://graph.facebook.com/{userid}/accounts?access_token={token}
此调用返回的JSON包含页面ID和这些页面的页面访问令牌。然后,您可以使用页面访问令牌发布到页面的时间轴。
但是,当我们尝试使用应用访问令牌调用此网址时,我们会收到OAuthException 102 “请求此资源需要用户访问令牌”。
请注意,这与OAuthException不同 104 “请求此资源需要访问令牌”(如果您忽略传递访问令牌,则会获得此权限),以及OAuthException < strong> 190 “无效的OAuth访问令牌签名”(如果访问令牌不是有效签名,您将获得此签名)。
因此我们的访问令牌有效,但对此特定网址无效。因此,我们似乎需要一个用户访问令牌,而不是应用访问令牌这个特定的Feed(我很久以前一直在关心为什么会这样,它似乎只是就是这样)。
关于这个主题的所有Facebook文档(我现在必须阅读所有这些文档)导致一个地方:http://developers.facebook.com/docs/authentication/server-side/,也就是“服务器端身份验证流程”页面。此页面描述了如何通过将用户重定向到auth对话框并询问相关权限来获取难以捉摸的用户访问令牌,但我们需要在没有用户交互的情况下实现此目的,并且用户已经为我们的应用程序提供了所有权限我们需要。所有这些自动发布都在音频的后处理中发生在服务器端,因此我们无论如何都无法在此阶段与用户进行交互。
我不明白。为什么我们可以使用应用访问令牌来获取我们想要的任何数据(好吧,无论他们给予我们什么许可),但 / accounts 数据我们需要不同的(用户) )访问令牌?
任何人都可以了解我们如何获取用户访问令牌,这样我们就可以在没有用户进一步互动的情况下获取用户的/ accounts数据吗?
答案 0 :(得分:2)
因此我们的访问令牌有效,但对此特定网址无效。因此,对于此特定Feed,我们似乎需要用户访问令牌而非应用访问令牌
由于每种访问令牌的权限,在这种特殊情况下,您确实需要有效的用户访问令牌。 Read all about access tokens and types。这就是它的方式。
此页面介绍了如何通过将用户重定向到auth对话框并询问相关权限来获取难以捉摸的用户访问令牌,但我们需要在没有用户交互的情况下实现此目的,并且用户已经提供了我们的应用程序我们需要的所有权限。
如果您的用户已经授予了他/她的权限,那么您为什么还要挣扎呢?我建议你坚持用户访问令牌。来自this endpoint:
https://www.facebook.com/dialog/oauth?client_id=..&redirect_uri=..&state=..&scope=..&response_type=..&display=.."
您检索代码,如下所示:
YOUR_REDIRECT_URI?code=OAUTH_CODE_GENERATED_BY_FACEBOOK&state=YOUR_STATE_VALUE
使用此代码生成用户访问令牌,如here所述:
https://graph.facebook.com/oauth/access_token?client_id=..&redirect_uri=..&client_secret=..&code=..
这会产生如下响应:
access_token=USER_ACCESS_TOKEN&expires=NUMBER_OF_SECONDS_UNTIL_TOKEN_EXPIRES
它是您的用户访问令牌。坚持下去。如您所见,它在响应中指示的值之后到期。如果您使用的是新API,则应该指示60天(这会让我回到这一点:不推荐使用offline_access,结果是短暂的 - 有效期为2小时 - 令牌),link。每当您的用户登录到您的应用并使用Facebook集成时,令牌会再次刷新60天。这意味着,如果您的用户不应该登录您的应用并使用它60天,它将会过期。
您可以检查用户访问令牌是否已过期:
https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN
如果是这样:使用您的应用访问令牌续订用户访问令牌,则会有详细记录right over here。但我引用了这一部分:
服务器端登录 要在这种情况下获取新的[用户]访问令牌,您必须再次通过完整的服务器端登录流程。但是,假设用户未取消您的应用程序的授权,当您将用户重定向到OAuth对话框时,系统不会提示他们重新授权您的应用程序,并且会立即将其重定向到redirect_uri。这意味着重新认证过程对用户来说可以显得相当透明。
底线:没有用户访问权限永久有效,但应用程序访问令牌却是。在使用它进行API调用之前,请保留您的用户访问令牌并检查它是否仍然有效。普通用户应该在60天内使用您的应用程序,而不应仅仅取消授权您的应用程序以获得乐趣。因此,用户应该重新授权的用例非常少见,但是,您需要预期它。