Я пытаюсь создать базу сигнатур для вызова API OAuth1. Это не работает, когда у меня есть URL в качестве параметра. Мне нужно сделать что-то особенное?
Когда я отправляю вызов API с моим кодом, он работает нормально, если у меня нет URL-адреса в качестве параметра. Когда я делаю это, он генерирует базу подписей, которая дает неверную подпись для аутентификации. Я могу сделать вызов API с параметром URL через такие программы, как бессонница, но он не работает, когда я пытаюсь сделать это с помощью кода.
Проблема связана с вызовами, содержащими часть "? Осуществляющих (...)". Если они содержат список нормальных параметров, таких как «? 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))));
Одна вещь, о которой я думал, это кодировка 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...