我正在尝试为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...