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)