查看Facebook以外的Facebook活动 - 在哪里放置访问令牌?

时间:2017-02-12 14:58:07

标签: javascript facebook facebook-graph-api

不幸的是,有很多代码段,但没有完整的代码示例。我试图让我的小组的活动在FB之外的网页上看到,并按照Javascript SDK示例快速启动我能够放入登录和共享按钮。但是当我尝试访问我的组的事件时,我收到错误 - “请求此资源需要访问令牌”。我在哪里将访问令牌放在此代码中?

window.fbAsyncInit = function() {
FB.init({
appId : '{myappID}',
xfbml : true,
version : 'v2.8'
});
FB.AppEvents.logPageView();
FB.api(
'/myGroupID/events',
'GET',
{},
function(response) {
// Insert your code here
}
);
};

有几件事:

  1. 我不需要我的用户登录,因为我的群组是公开的;我的活动是公开的。如果有人随便浏览我的网站,我希望他们能够看到这些事件。

  2. 我遇到麻烦的其他一件事是非常简短的答案。来自.NET社区,我习惯于看到很多教程,以及许多关于如何做事的完整代码示例。很少有“长篇”答案或教程 - 甚至stackoverflow答案(如this one)都没有包含足够的细节来说明如何做这些事情。特别是访问令牌的东西。

  3. 是否有完整的例子说明如何做到这一点? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以像这样添加令牌:

FB.api(
'/myGroupID/events',
'GET',
{access_token: 'xxx'},...

...但是这会让访问该网站的每个人暴露您的令牌(这总是被保密)。你必须做那个API调用服务器端。查看PHP SDK或只使用PHP cURL。令牌只是一个GET参数。

答案 1 :(得分:0)

好的,我明白了。所有这一切的要点是获得Facebook所说的Access Token。访问令牌实际上是appsecret_proof(而不是access_token - access_token是另一回事。请参阅本文后面的内容),所以要注意这一点。我拼凑了一些不同的代码示例(如this one,以及对Facebook图形api文档的超级,非常仔细的阅读,以得到答案。我使用C#而不是Javascript进行编码,因为需要完成很多这样的操作服务器方面,无论如何我都很舒服。

我创建了一个控制台应用程序作为概念证明。几点说明:

  • 在我的情况下,page_id是一个组,而不是(大写P)页面, 这是另一回事。

  • access_tokenapp_secret来自应用 你(希望)已经创造了。 (如果你需要首先获得access_token,那就在那里 是一些文档out there来帮助你开始这部分。)你也应该 确保使用(从.NET 1.0开始)dotnet核心secret manager 在你发展的同时保护你的秘密,这样你就不会通过它们 通过源代码控制。

  • 最后一个很重要 - appsecret_proof是您的access_tokenapp_secret一起散列的组合(app_secret是关键)和然后成为查询字符串的一部分。这就是Facebook所说的#34;需要访问令牌来请求此资源。"

    public static string page_id = {your_page_id};
    public static string access_token = {your_app_access_token};
    public static string app_secret = {your_app_secret};
    public static string appsecret_proof = FaceBookSecret(access_token, app_secret); 
    
    static void Main(string[] args)
        {
            Console.WriteLine("Making API Call...");
            using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }))
            {
                client.BaseAddress = new Uri("https://graph.facebook.com/" + page_id + "/");
                HttpResponseMessage response = client.GetAsync("events?access_token=" + access_token + "&appsecret_proof=" + appsecret_proof).Result;
                response.EnsureSuccessStatusCode();
                string result = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine("Result: " + result);
    
            }
            Console.ReadLine();
        }
    
    internal static string FaceBookSecret(string content, string key)
    {
        byte[] keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] messageBytes = Encoding.UTF8.GetBytes(content);
        byte[] hash;
        using (HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes))
        {
            hash = hmacsha256.ComputeHash(messageBytes);
        }
    
        StringBuilder sbHash = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sbHash.Append(hash[i].ToString("x2"));
        }
        Console.WriteLine(sbHash);
        return sbHash.ToString();
    }
    

因此,在所有这些运行之后,我得到了一个包含所有事件的好的json字符串。