c# - 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();
}
解决方案
推荐阅读
- r - 仅对列表中的数字部分求和
- azure-devops - Synapse - 无法正确部署 SQL 链接服务器
- java - 连接本地主机失败(桌面)
- python-3.x - dagster - 错误 - train_pipeline | S3 URI AWS
- css - 使用纯 CSS 的简单倒计时圆形动画
- python - 项目问题,求图片处理方面的建议
- css - 自定义 div 形状 CSS?
- python - 没有连接到 MariaDB
- mongodb - 根据MongoDB聚合中的数组排序
- azure - 有没有办法在 azure 函数应用程序中使用 terraform 创建 HTTPtriggers