首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建Facebook AppSecret_Proof HMACSHA256所需的AppSecret_Proof帮助

创建Facebook AppSecret_Proof HMACSHA256所需的AppSecret_Proof帮助
EN

Stack Overflow用户
提问于 2013-12-13 17:31:01
回答 2查看 2.4K关注 0票数 12

Facebook要求我创建一个appsecret_proof:https://developers.facebook.com/docs/graph-api/securing-requests

我使用以下代码完成了这一工作:

代码语言:javascript
复制
public string FaceBookSecret(string content, string key)
{
        var encoding = new System.Text.ASCIIEncoding();
        byte[] keyByte = encoding.GetBytes(key);
        byte[] messageBytes = encoding.GetBytes(content);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return Convert.ToBase64String(hashmessage);
        }
}

对我来说一切看起来都很好,不过facebook说appsecret_proof是无效的。我是登录的,我可以做一切正常的时候,我删除了钥匙。所以为了节省一些时间:

  • 是的,我张贴到正确的网址
  • 是的,我正在传递一个有效的access_token
  • 是的,我在证明中使用的是相同的access_token,就像在请求中一样。
  • 是的,我的秘密很好,而且很有效。

用法中的示例

代码语言:javascript
复制
dynamic results = client.Post("/" + model.PostAsId + "/feed", new { message = model.Message, appsecret_proof = FaceBookSecret(postAs.AuthToken, AppSecret) });

我认为这可能与编码有关,或者类似于编码,但老实说,我只是不知道。

我也在使用Facebook .net SDK,但是这在文档中没有太多,而且似乎与自动化、服务器端操作等没有任何关系。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 12:00:59

应用程序的秘密是一个基-16字符串,所以您需要将其转换为一个字节数组。有关如何执行此操作的详细信息,请查看How can I convert a hex string to a byte array?。需要使用ASCII编码将access_token转换为字节数组。一旦生成HMAC,然后将其编码为基-16字符串,作为appsecret_proof使用。下面的代码将将字节数组转换为base16。

代码语言:javascript
复制
public static class Base16
{
    private static readonly char[] encoding;

    static Base16()
    {
        encoding = new char[16]
        {
            '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
        };
    }

    public static string Encode(byte[] data)
    {
        char[] text = new char[data.Length * 2];

        for (int i = 0, j = 0; i < data.Length; i++)
        {
            text[j++] = encoding[data[i] >> 4];
            text[j++] = encoding[data[i] & 0xf];
        }

        return new string(text);
    }
}

生成appsecret_proof的代码将是

代码语言:javascript
复制
private string GenerateAppSecretProof(string accessToken, string appSecret)
{
    byte[] key = Base16.Decode(appSecret);
    byte[] hash;
    using (HMAC hmacAlg = new HMACSHA1(key))
    {
        hash = hmacAlg.ComputeHash(Encoding.ASCII.GetBytes(accessToken));
    }
    return Base16.Encode(hash);
}

Facebook似乎要么接受SHA256 HMAC要么接受SHA1 HMAC

票数 0
EN

Stack Overflow用户

发布于 2014-01-31 05:53:13

我已经在Facebook上成功地使用了下面的内容

代码语言:javascript
复制
using System.Security.Cryptography;
using System.Text;

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"));
    }
    return sbHash.ToString();
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20572523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档