OAuth 1.0 продолжает выдавать мне недопустимый метод подписи

#c# #oauth

Вопрос:

Хотя, кажется, существует множество ответов, ни один из них, похоже, не работает для меня. Мне нужно интегрировать wordpress с сайтом woocommerce и использовать OAuth 1.0.

У меня есть следующая база кода, но я продолжаю получать ошибку недопустимой подписи.

 private static readonly RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();

public RestClient() {
    site = ConfigurationManager.AppSettings["ukstore"];
    consumerkey = ConfigurationManager.AppSettings["wookey"];
    woosecret = ConfigurationManager.AppSettings["woosecret"];
}

public async Task<string> PostToWoo<T>(string endpoint, T postdata)
            where T : class {
    var request = new RestRequest(Method.POST);

    var fullEndPoint = string.Concat(site, "/wp-json/wc/v3/", endpoint);

    var serializedData = JsonConvert.SerializeObject(postdata);
    var restpoint = BuildAuthorisationUrl(fullEndPoint);

    var client = new RestSharp.RestClient(restpoint);
    client.Timeout = -1;
                
    request.AddHeader("Content-Type", "application/json");

    request.AddJsonBody(serializedData);
    var response = await Task.Run(() => client.Execute(request));

}

private string BuildAuthorisationUrl(string Url)
{
    var sb = new StringBuilder();
    var nonce = GenerateNonce(11); 
    var timeStamp = Math.Truncate((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString(); 
    var signature = GenerateSignature(nonce, timeStamp, new Uri(Url));

    sb.Append(GenerateQueryStringOperator(sb.ToString())   "oauth_consumer_key="   Uri.EscapeDataString(consumerkey));
    sb.Append("amp;oauth_signature_method="   Uri.EscapeDataString("HMAC-SHA1"));
    sb.Append("amp;oauth_timestamp="   Uri.EscapeDataString(timeStamp));
    sb.Append("amp;oauth_nonce="   Uri.EscapeDataString(nonce));
    sb.Append("amp;oauth_version="   Uri.EscapeDataString("1.0"));
    sb.Append("amp;oauth_signature="   Uri.EscapeDataString(signature));

    return Url   sb.ToString();
}

private string GenerateNonce(int length)
{
    var data = new byte[length];
    random.GetNonZeroBytes(data);
    return Convert.ToBase64String(data);
}
    
private string GenerateSignature(string nonce, string timeStamp, Uri url)
{
    var signatureBase = GenerateBase(nonce, timeStamp, url);
    var signatureKey = string.Format("{0}amp;{1}", woosecret, "");
    var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(signatureKey));
    return Convert.ToBase64String(hmac.ComputeHash(new ASCIIEncoding().GetBytes(signatureBase)));
}

private string GenerateBase(string nonce, string timeStamp, Uri url)
{
    var parameters = new SortedDictionary<string, string>
    {
        {"oauth_consumer_key", consumerkey},
        {"oauth_signature_method", "HMAC-SHA1"},
        {"oauth_timestamp", timeStamp},
        {"oauth_nonce", nonce},
        {"oauth_version", "1.0"}
    };

    var sb = new StringBuilder();
    sb.Append(Uri.EscapeDataString(url.AbsoluteUri));
    sb.Append("amp;"   Uri.EscapeDataString(NormalizeParameters(parameters)));
    return sb.ToString();
}

private string GenerateQueryStringOperator(string currentUrl)
{
    if (currentUrl.Contains("?"))
        return "amp;";
    else
        return "?";
}

private string NormalizeParameters(SortedDictionary<string, string> parameters)
{
    StringBuilder sb = new StringBuilder();

    var i = 0;
    foreach (var parameter in parameters)
    {
        if (i > 0)
            sb.Append("amp;");
            sb.AppendFormat("{0}={1}", parameter.Key, parameter.Value);
            i  ;
    }

    return sb.ToString();
}