使用url作为参数为C#中的OAuth1签名生成签名库

时间:2019-05-28 14:16:11

标签: c# api oauth

我正在尝试为OAuth1 API调用生成签名库。当我将URL作为参数时,它不起作用。那我需要做点特别的事情吗?

当我使用代码发送API调用时,只要没有URL作为参数,它就可以正常工作。当我这样做时,它将生成一个签名库,该签名库为身份验证提供了错误的签名。我可以通过失眠之类的程序使用URL参数进行API调用,但是当我尝试使用代码进行调用时会失败。

问题在于包含“?implementing(...)”部分的调用。如果它们包含诸如“?aktive = true&read_only = true”之类的常规参数列表,则可以正常工作。

我已经研究了这个问题,问题是生成的签名。我可以想到的唯一问题是signatureBase参数。

var url = "https://www.example.com/api/1/resources?implementing(http://www.example.com/method5/1.2)";
OAuthContext requestContext = new OAuthContext
            {
                RequestMethod = "GET",
                RawUri = new Uri(url),
                ConsumerKey = "somethingsomethingsomething",
                SignatureMethod = "HMAC-SHA1",
                Timestamp = timeStamp,
                Version = "1.0",
                Nonce = nonce,
            };
var signatureBase = requestContext.GenerateSignatureBase();
var signature = Uri.EscapeDataString(Convert.ToBase64String(hmac.ComputeHash(new ASCIIEncoding().GetBytes(signatureBase))));

我一直在考虑的一件事是signatureBase的URL编码。但是我不知道它会是什么样。 signatureBase如下所示:

GET&https%3A%2F%2Fwww.example.com%2Fapi%2F1%2Fresources&%3Dimplementing%2528http%253A%252F%252Fwww.example.com%252Fmethod5%252F1.2%2529...

...是预期的随机数,时间戳,版本和签名方法。

我知道URL参数已经过双重编码,但是如果我手动将其更改为单一编码,则无济于事。就是这样:

GET&https%3A%2F%2Fwww.example.com%2Fapi%2F1%2Fresources&%3Dimplementing%28http%3A%2F%2Fwww.example.com%2Fmethod5%2F1.2%29...

0 个答案:

没有答案