Проблема в том, что я продолжаю получать недопустимое сообщение при входе в систему, когда пытаюсь подключиться к конечной точке NetSuite. Странно то, что я могу получить успешный ответ в почтальоне. Я также обнаружил, что если я использую заголовок авторизации, созданный в почтальоне, я получу успешный ответ в своем коде. В частности, nonce и timestamp, похоже, работают только от почтальона. Временная метка, которую я создаю в своем коде, всегда находится в секундах от той, которая была создана в почтальоне. Оба используют unix время. Я читал, что конечное время может быть выключено, что приведет к ошибке. Но временная метка в почтальоне находится в секундах от той, которую я генерирую в своем коде, и это прекрасно работает. Для одноразового номера я сделал его такой же длины, как у почтальона. И это всегда уникально для каждого звонка.
public class NetSuiteService
{
string accountId = "xxxx";
string consumerKey = "xxxx";
string consumerSecret = "xxxx";
string tokenId = "xxxx";
string tokenSecret = "xxxx";
string _nonce;
string _timestamp;
string url = "url";
public NetSuiteService()
{
Test();
}
public void Test()
{
GetTimeStamp();
GetNonce();
string encodedUrl = Uri.EscapeDataString(url);
var signatureBaseString = GetSignatureBaseString(encodedUrl);
var signatureString = GetSginatureString(signatureBaseString);
var authorizationHeader = GetAuthorizationHeader(signatureString);
var client = new RestClient(url);
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorizationHeader);
request.AlwaysMultipartFormData = true;
IRestResponse response = client.Execute(request);
var content = response.Content;
}
private string GetSignatureBaseString(string url)
{
var signatureBaseString = "GET" + "&";
signatureBaseString += url.ToLower() + "&";
signatureBaseString += Uri.EscapeDataString(
"oauth_consumer_key=" + Uri.EscapeDataString(consumerKey) + "&" +
"oauth_nonce=" + Uri.EscapeDataString(_nonce) + "&" +
"oauth_signature_method=" + Uri.EscapeDataString("HMAC-SHA1") + "&" +
"oauth_timestamp=" + Uri.EscapeDataString(_timestamp) + "&" +
"oauth_token=" + Uri.EscapeDataString(tokenId) + "&" +
"oauth_version=" + Uri.EscapeDataString("1.0")
);
return signatureBaseString;
}
private string GetSginatureString(string signatureBaseString)
{
var key = Uri.EscapeDataString(consumerSecret) + "&" + Uri.EscapeDataString(tokenSecret);
var signatureEncoding = new ASCIIEncoding();
var keyBytes = signatureEncoding.GetBytes(key);
var signatureBaseBytes = signatureEncoding.GetBytes(signatureBaseString);
string signatureString;
using (var hmacSHA1 = new HMACSHA1(keyBytes))
{
var hashBytes = hmacSHA1.ComputeHash(signatureBaseBytes);
signatureString = Convert.ToBase64String(hashBytes);
}
signatureString = Uri.EscapeDataString(signatureString);
return signatureString;
}
private string GetAuthorizationHeader(string signatureString)
{
string SimpleQuote(string s) => '"' + s + '"';
var header =
"OAuth realm=" + SimpleQuote(accountId) + "," +
"oauth_consumer_key=" + SimpleQuote(consumerKey) + "," +
"oauth_nonce=" + SimpleQuote(_nonce) + "," +
"oauth_signature_method=" + SimpleQuote("HMAC-SHA1") + "," +
"oauth_timestamp=" + SimpleQuote(_timestamp) + "," +
"oauth_token=" + SimpleQuote(tokenId) + "," +
"oauth_version=" + SimpleQuote("1.0") + "," +
"oauth_signature=" + SimpleQuote(signatureString);
return header;
}
private void GetTimeStamp()
{
_timestamp = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString();
}
private void GetNonce()
{
var nonce = Guid.NewGuid().ToString().Replace("-", "");
_nonce = new string(nonce.Take(11).ToArray());
}
}