Посылка OAuth 1.0 в NetSuite - PullRequest
0 голосов
/ 20 марта 2020

Проблема в том, что я продолжаю получать недопустимое сообщение при входе в систему, когда пытаюсь подключиться к конечной точке 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());
    }
}
...