Oauth 401 Error invalid signature when requesting to woocommerce rest api with httpclient .net core

Viewed 51

First of all I know I can use trusted libraries to generate oAuth header signature but I spent a lot of time to generate this signature and I want to know why it's not working.

I have ConsumerKey and ConsumerSecret to access woocommerce rest api.

I write a method to generate BaseSignatureString and another method to get HMAC-SHA1 :

public static string GetoAuthToken(string conKey, string conSecret)
    {
        string timestamp = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString();
        string nonce = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(timestamp
        + timestamp + timestamp));


        var signatureBaseString = "GET&" + Uri.EscapeDataString("https://loomina.ir/wp-json/wc/v3/products") + "&";
        signatureBaseString += Uri.EscapeDataString($"oauth_consumer_key={conKey}&");
        signatureBaseString += Uri.EscapeDataString($"oauth_nonce={nonce}&");
        signatureBaseString += Uri.EscapeDataString($"oauth_signature_method=HMAC-SHA1&");
        signatureBaseString += Uri.EscapeDataString($"oauth_timestamp={timestamp}&");
        signatureBaseString += Uri.EscapeDataString($"oauth_version=1.0");

        string SHA1HASH = GetSha1Hash(conSecret + "&" , signatureBaseString);

        string Header = $"oauth_consumer_key=\"{conKey}\",oauth_timestamp=\"{timestamp}\",oauth_signature_method=\"HMAC-SHA1',oauth_nonce=\"{nonce}\",oauth_version=\"1.0\",oauth_signature=\"{SHA1HASH}\"";

        return Header;
    }

Get SHA1 Hash :

public static string GetSha1Hash(string key, string baseSignatureString)
    {
        var encoding = new ASCIIEncoding();

        byte[] keyBytes = encoding.GetBytes(key);
        byte[] messageBytes = encoding.GetBytes(baseSignatureString);

        string Sha1Result = string.Empty;

        using (HMACSHA1 SHA1 = new HMACSHA1(keyBytes))
        {
            var Hashed = SHA1.ComputeHash(messageBytes);
            Sha1Result = Convert.ToBase64String(Hashed);
        }

        return Sha1Result;
    }

Request part :

var oAuthSignature = Utility.GetoAuthToken(websites.CustomerKey, websites.CustomerSecret);
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("OAuth", oAuthSignature);
var response = await _client.GetAsync($"{websites.Url}/wp-json/wc/v3/products/");
var result = await response.Content.ReadAsStringAsync();

The status of request is 401 Not Authorized (Invalid signature)

0 Answers
Related