#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();
}