首页 > 解决方案 > OAuth 1.0 不断给我一个无效的签名方法

问题描述

尽管那里似乎有很多答案,但它们似乎都不适合我。我需要将 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("&oauth_signature_method=" + Uri.EscapeDataString("HMAC-SHA1"));
    sb.Append("&oauth_timestamp=" + Uri.EscapeDataString(timeStamp));
    sb.Append("&oauth_nonce=" + Uri.EscapeDataString(nonce));
    sb.Append("&oauth_version=" + Uri.EscapeDataString("1.0"));
    sb.Append("&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}&{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("&" + Uri.EscapeDataString(NormalizeParameters(parameters)));
    return sb.ToString();
}

private string GenerateQueryStringOperator(string currentUrl)
{
    if (currentUrl.Contains("?"))
        return "&";
    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("&");
            sb.AppendFormat("{0}={1}", parameter.Key, parameter.Value);
            i++;
    }

    return sb.ToString();
}

标签: c#oauth

解决方案


推荐阅读