Facebook graph api 在C#SDK中请求页面访问令牌

Facebook graph api 在C#SDK中请求页面访问令牌,facebook-graph-api,oauth,facebook-c#-sdk,Facebook Graph Api,Oauth,Facebook C# Sdk,作为一个简单后台应用程序的概念证明,我使用Graph API Explorer为我的应用程序创建了一个访问令牌,以便将一些内容发布到我维护的页面的墙上。它工作得很好。但是,令牌自然会过期 所以现在我尝试让后台应用程序在每次运行时自动请求一个新的页面访问令牌。我很难找到一个具体的定义如何做到这一点。关于Facebook和访问令牌的信息并不缺乏,但似乎没有任何东西能够演示如何在页面上发布后台应用程序。(不张贴到用户的墙上,不向用户显示登录对话框,因为它是后台应用程序,等等) 通过读取web请求对此U

作为一个简单后台应用程序的概念证明,我使用Graph API Explorer为我的应用程序创建了一个访问令牌,以便将一些内容发布到我维护的页面的墙上。它工作得很好。但是,令牌自然会过期

所以现在我尝试让后台应用程序在每次运行时自动请求一个新的页面访问令牌。我很难找到一个具体的定义如何做到这一点。关于Facebook和访问令牌的信息并不缺乏,但似乎没有任何东西能够演示如何在页面上发布后台应用程序。(不张贴到用户的墙上,不向用户显示登录对话框,因为它是后台应用程序,等等)

通过读取web请求对此URL的响应,我可以很容易地在代码中获取访问令牌:

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用户界面中执行某个步骤,以永久性地授予应用程序执行此操作的权限,我想我已经执行了该步骤,但最好以某种方式再次检查。)
编辑:有人向我描述过,我需要获得一个长期用户访问令牌,并使用它获得一个页面访问令牌。理论上说,页面访问令牌不会过期。然而,我不清楚的是如何做到这一点

我也读过。然而,我显然误解了一些事情。在前者中,它引用后者来获得适当的令牌。但是,后者包括向用户显示登录名、让用户接受权限以及使用该登录名的响应的步骤

作为一个无人值守的后台进程,向用户(可能是我)提出任何类型的问题实际上都不是一个选项。我还被告知,我不能从浏览器中一次性请求获取访问令牌,因为根据定义,这是客户端交互,而不是必要的服务器端流的一部分。(我觉得奇怪的是,该服务会关心RESTful请求是来自web浏览器还是来自应用程序,但我对OAuth或Facebook API不够熟悉,无法真正进行调用。)

那么,如果我可以执行一些手动步骤来获取应用程序的永久访问令牌以发布到Facebook页面,那么这些步骤是什么?相反,如果我可以在应用程序中执行一些自动化步骤,以便在每次运行时获得访问权限,那么这些步骤是什么

(从应用程序中再调用几个API会给一个每天一次的进程增加一到两秒钟的运行时间,所以对我来说采取哪种方法没有什么区别。)

作为一个无人值守的后台进程,向用户(可能是我)提出任何类型的问题实际上都不是一个选项

正如我已经说过的,你只需要做一次

您可以获得您的非过期页面访问令牌,将其复制并粘贴到您的应用程序中–从那时起,您的应用程序可以在服务器端执行任何它想执行的操作

我还被告知,我不能从浏览器中一次性请求获取访问令牌,因为根据定义,这是客户端交互,而不是必要的服务器端流的一部分

获取用户访问令牌的服务器端身份验证流也需要部分参与浏览器

不管您是通过客户端身份验证流获得一个短期令牌并随后对其进行扩展,还是使用服务器端身份验证流获得一个长期令牌

(我觉得奇怪的是,服务会关心RESTful请求是否来自web浏览器,而不是来自应用程序[…])

Facebook不希望用户将其登录凭据提供给任何第三方。因此,获取用户访问令牌的过程始终必须参与浏览器,用户登录到Facebook

那么,如果我可以执行一些手动步骤来获取应用程序的永久访问令牌以发布到Facebook页面,那么这些步骤是什么


获取具有管理页面权限的长期用户访问令牌。(或者获得一个短期的,并扩展它)。然后,按照文档中描述的方式,使用该长期令牌为目标页面请求页面访问令牌。

起初,我只是进入Facebook应用程序设置并重新启用了不推荐的“脱机访问”权限。上述应用程序设置可在如下URL中找到:

https://developers.facebook.com/apps/{APPLICATION_ID}/advanced
{
  "name": "Some Facebook Application Name",
  "access_token": "{LONG_LIVED_PAGE_ACCESS_TOKEN}",
  "category": "Musician/band",
  "id": "{APPLICATION_ID}",
  "perms": [
    "ADMINISTER",
    "EDIT_PROFILE",
    "CREATE_CONTENT",
    "MODERATE_CONTENT",
    "CREATE_ADS",
    "BASIC_ADMIN"
  ]
}
https://developers.facebook.com/apps/{APPLICATION_ID}/advanced
然而,因为所有的东西都在说那个设置是“不推荐的”,所以我不想把它作为一个长期的解决方案。它可能会被完全删除,在某些情况下可能不安全,等等。最好使用推荐的功能

下面是我从一个拾荒者搜寻中拼凑出来的东西,通过更新的文档、过时的文档、大量过时的互联网帖子和PHP代码,这些代码大多对功能做出了假设,但并非在所有情况下都是真的

访问并从下拉菜单中选择您的Facebook应用程序。单击“获取访问令牌”并选择所需的权限。(对于我的,我转到“扩展权限”选项卡,选择了“托管页面”和“发布流”。)系统将提示您(
https://graph.facebook.com/{FACEBOOK_USER_ID}/accounts?
  access_token={LONG_LIVED_USER_ACCESS_TOKEN}
{
  "name": "Some Facebook Application Name",
  "access_token": "{LONG_LIVED_PAGE_ACCESS_TOKEN}",
  "category": "Musician/band",
  "id": "{APPLICATION_ID}",
  "perms": [
    "ADMINISTER",
    "EDIT_PROFILE",
    "CREATE_CONTENT",
    "MODERATE_CONTENT",
    "CREATE_ADS",
    "BASIC_ADMIN"
  ]
}
var client = new FacebookClient("{LONG_LIVED_PAGE_ACCESS_TOKEN}");
dynamic parameters = new ExpandoObject();
parameters.message = "This is a my status update.";
dynamic result = client.Post("{FACEBOOK_PAGE_ID}/feed", parameters);
https://developers.facebook.com/apps/{APPLICATION_ID}/advanced
https://developers.facebook.com/apps/123456/advanced