【发布时间】:2012-11-05 11:38:42
【问题描述】:
作为一个简单后台应用程序的概念证明,我使用 Graph API Explorer 为我的应用程序创建了一个访问令牌,以便将某些内容发布到我维护的页面的墙上。它工作得很好。但是,令牌自然会过期。
所以现在我试图让后台应用程序在每次运行时自动请求一个新的页面访问令牌。而且我很难找到如何做到这一点的具体定义。关于 Facebook 和 Access Tokens 的信息并不缺乏,但似乎没有什么可以说明如何将后台应用程序发布到页面。 (不张贴到用户的墙上,不向用户显示登录对话框,因为它是后台应用程序等)
通过读取来自该 URL 的 Web 请求的响应,我可以很容易地在代码中获取访问令牌:
https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id={MY_APP_ID}&client_secret={MY_APP_SECRET}
当然,“访问令牌”在尝试发布到页面墙上时不起作用。它表示用户尚未授权应用程序执行此操作。我正在执行的操作非常简单:
var client = new FacebookClient(GetFacebookAccessToken());
dynamic parameters = new ExpandoObject();
parameters.message = "this is a test";
dynamic result = client.Post("{MY_PAGE_ID}/feed", parameters);
我在某些地方读到,我需要使用第一个访问令牌发出第二个请求,以获取页面访问令牌。但我似乎找不到如何做到这一点的例子。
有人可以帮我解释一下吗?
- 我有一个 Facebook 页面。
- 我有一个 Facebook 应用程序,除了为本地后台应用程序提供访问所述页面的方法外,没有其他目的。
- 我只需要该应用程序能够进行身份验证,以便它可以向页面发布内容。
- (如果我需要在 Facebook UI 中执行某个步骤以永久授予应用程序执行此操作的权限,我想我已经执行了该步骤,但最好以某种方式仔细检查。)
编辑:有人向我描述过我需要获得一个长期存在的用户访问令牌,并使用它来获得一个页面访问令牌。理论上,所述页面访问令牌不会过期。但是,我不清楚的是如何做到这一点。
我读过the page describing the deprecation of offline_access 和the page describing server-side access。但是,我显然误解了一些东西。在前者中,它引用后者来获取正确的令牌。然而,后者包括向用户显示登录、让他们接受权限以及使用来自该登录的响应的步骤。
作为一个无人看管的后台进程,向用户(可能是我)提出任何类型的问题并不是一个真正的选择。我还被告知我不能从浏览器发出一次性请求来获取访问令牌,因为根据定义,这是客户端交互,而不是必要的服务器端流程的一部分。 (我觉得奇怪的是,服务会关心 RESTful 请求是来自 Web 浏览器还是来自应用程序,但我对 OAuth 或 Facebook API 还不够熟悉,无法真正进行调用。)
那么,如果我可以执行一些手动步骤来获取永久访问令牌,以便应用发布到 Facebook 页面,那么这些步骤是什么?相反,如果我可以在应用程序中执行一些自动化步骤以在每次运行时获取访问权限,那么这些步骤是什么?
(从应用程序进行更多的 API 调用会为原本一天一次的流程增加一到两秒的运行时间,因此对我来说采用哪种方法没有区别。)
【问题讨论】:
-
如果没有用户交互,您将无法获得新令牌。但是,如果您使用 long-lived 用户访问令牌获取页面访问令牌,则默认情况下页面令牌不会过期。
-
用户令牌在 60 天后过期,但页面访问令牌不会。以及如何获得它们,我刚刚说了。
-
您展示的第一段代码用于获取应用访问令牌。对于用户令牌,您必须遵循文档中概述的服务器端流程。
-
我第一条评论的第一句话。您必须执行 一次 以获得长期用户访问令牌。
标签: facebook-graph-api oauth facebook-c#-sdk