OAuth 1.0 POST - «Неверная подпись» C # - PullRequest
0 голосов
/ 01 ноября 2018

Я звоню на следующий StackPath

Я пробовал различные существующие библиотеки, такие как oauth и MaxCDN , которые возвращают ответ:

{"code":500,"error":{"message":"Invalid signature","type":""}}

Все запросы Get, использующие указанную выше библиотеку oauth, работают нормально, но не для POST.

С помощью Почтальона мне удалось сделать успешную публикацию в API, но я не уверен, как они генерируют свои подписи, используя вкладку Авторизация.

Я создал класс для создания Авторизации вручную, используя следующее ...

sb создает значение заголовка Authorization:

public string GenerateAuthorizationHeader(string method, string url)
{
    StringBuilder sb = new StringBuilder("OAuth ");
    sb.Append("oauth_consumer_key=\"" + _consumer_key + "\",");
    sb.Append("oauth_nonce=\"" + _nonce + "\",");
    sb.Append("oauth_signature=\"" + GetSignature() + "\",");
    sb.Append("oauth_signature_method=\"" + _signature_method + "\",");
    sb.Append("oauth_timestamp=\"" + _timestamp + "\",");
    sb.Append("oauth_version=\"" + _version + "\"");

    return sb.ToString();
}

GetSignature () создает базовую строку:

private string GetSignatureBaseString()
{
    string basestring = "oauth_consumer_key=" + Uri.EscapeDataString(_consumer_key);
    basestring += "&" + "oauth_nonce=" + Uri.EscapeDataString(_nonce);
    basestring += "&" + "oauth_signature_method=" + Uri.EscapeDataString(_signature_method);
    basestring += "&" + "oauth_timestamp=" + Uri.EscapeDataString(_timestamp);
    basestring += "&" + "oauth_version=" + Uri.EscapeDataString(_version);

    basestring = _method + "&" + Uri.EscapeDataString(_url) + "&" + Uri.EscapeDataString(basestring);

    return basestring;
}

Базовая строка хэшируется с использованием секрета потребителя, и GetSignature () возвращает строку:

private string GetHashedSignature(string baseString)
{
    var encode = new ASCIIEncoding();

    byte[] keyBytes = encode.GetBytes(_consumer_secret);
    byte[] msgBytes = encode.GetBytes(baseString);

    string result = "";

    using (HMACSHA1 sha1 = new HMACSHA1(keyBytes))
    {
        var hashed = sha1.ComputeHash(msgBytes);
        result = Convert.ToBase64String(hashed);
    }

    return Uri.EscapeDataString(result);
}

И GET, и POST не работают, используя мой код. Может кто-нибудь найти ошибку в моем коде или предоставить какую-либо информацию о том, как Postman генерирует свои значения заголовка авторизации OAuth 1.0, в частности oauth_signature?

** Edit Я пошел с RestSharp - не стесняйтесь отвечать для будущих пользователей.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы неправильно формируете базовую строку. В частности, RFC 5849 §3.4.1 дает точные указания относительно того, как путь и параметры запроса URI (или тело запроса сущности) должны быть нормализованы, упорядочены и экранированы. Uri.EscapeDataString(_url) недостаточно.

Я бы рекомендовал использовать существующую, хорошо протестированную библиотеку для создания подписи, а не переопределять RFC с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...