Search code examples
c#authenticationasp.net-web-apioauth-1.0ahmacsha256

Integration of Netsuite oAuth 1.0 Get API with HTTPCLIENT


Postman Screenshot1 Postman Screenshot2

I'm currently working on integrating OAuth 1.0 authentication into my C# Web API project. I need to use the HMAC-SHA256 signature method, and I'm encountering issues with generating the correct OAuth header. I need to pass consumerKey,consumerSecret,accessToken,accessTokenSecret,realm to the request headers

public class OAuth1HttpClient
    {
        private const string url = "";
        private const string consumerKey = "";
        private const string consumerSecret = "";
        private const string accessToken = "";
        private const string accessTokenSecret = "";
        private const string realm = "";

        public async Task<string> TestConnectionAsync()
        {
            using (HttpClient httpClient = new HttpClient())
            {
                
                var authorizationHeader = "oauth_consumer_key=" + Uri.EscapeDataString(consumerKey) + "&" +
                                         "oauth_signature_method=HMAC-SHA1&" +
                                         "oauth_token=" + Uri.EscapeDataString(accessToken) + "&" +
                                         "oauth_version=1.0" +
                                         "realm=\"" + Uri.EscapeDataString(realm) + "\"";

                httpClient.DefaultRequestHeaders.Add("Authorization", authorizationHeader);

                HttpResponseMessage response = httpClient.GetAsync(url).Result;

      string responseData =  response.Content.ReadAsStringAsync().Result;
                return responseData;

   }
 } 


Solution

  • public class OAuthConnector
    {
        public string GetRequest()
        {
            string ScriptId = "1136", DeploymentId = "1";
            string json = string.Empty;
            try
            {
                var parameters = new SignatureParamaters
                {
                    ConsumerKey = "",
                    ConsumerSecret = "",
                    DeploymentId = DeploymentId,
                    HttpMethod = "GET",
                    NetsuiteId = "",
                    NetsuiteUrl = "",
                    ScriptId = ScriptId,
                    TokenKey = "",
                    TokenSecret = "",
                    SignatureMethod = "HMAC-SHA256"
                };
    
                var signature = Generate(parameters);
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                var myUri = new Uri("https://tstdrv1029776.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=" + ScriptId + "&deploy=" + DeploymentId);
                var myWebRequest = WebRequest.Create(myUri);
                var myHttpWebRequest = (HttpWebRequest)myWebRequest;
                myHttpWebRequest.Headers.Add("Authorization", signature);
                myHttpWebRequest.Method = "GET";
                myHttpWebRequest.ContentType = "application/json";
                myHttpWebRequest.ContentLength = 0;
                var myWebResponse = myWebRequest.GetResponse();
                var responseStream = myWebResponse.GetResponseStream();
    
                if (responseStream != null)
                {
                    var myStreamReader = new StreamReader(responseStream, Encoding.Default);
                    json = myStreamReader.ReadToEnd();
                    responseStream.Close();
                }
                myWebResponse.Close();
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            return json;
        }
        public string Generate(SignatureParamaters paramaters)
        {
            var newTimestamp = GenerateTimestamp();
            var newNonce = GenerateNonce();
            return GenerateWithNonceAndTimestamp(paramaters, newTimestamp, newNonce);
    
        }
        public string GenerateWithNonceAndTimestamp(SignatureParamaters paramaters, int timestamp, string nonce)
        {
            return CreateAuth(paramaters, GenerateSignature(paramaters, timestamp, nonce), timestamp, nonce);
        }
        private string CreateAuth(SignatureParamaters paramaters, string signature, int timestamp, string nonce)
        {
            return string.Format(
                    "OAuth oauth_consumer_key=\"{0}\",oauth_token=\"{1}\",oauth_signature_method=\"{2}\",oauth_timestamp=\"{3}\",oauth_nonce=\"{4}\",oauth_version=\"1.0\",oauth_signature=\"{5}\",realm=\"{6}\"",
                    paramaters.ConsumerKey,
                    paramaters.TokenKey,
                    paramaters.SignatureMethod,
                    timestamp,
                    nonce,
                    signature,
                    paramaters.NetsuiteId
                );
        }
    
    
    
        private string GenerateSignature(SignatureParamaters paramaters, int timestamp, string nonce)
        {
            var rightSide = string.Format(
                "deploy={0}&oauth_consumer_key={1}&oauth_nonce={2}&oauth_signature_method={3}&oauth_timestamp={4}&oauth_token={5}&oauth_version={6}&script={7}",
                paramaters.DeploymentId,
                paramaters.ConsumerKey,
                nonce,
                paramaters.SignatureMethod,
                timestamp,
                paramaters.TokenKey,
                "1.0",
                paramaters.ScriptId
            );
    
            var baseString = string.Format(
                "{0}&{1}&{2}",
                paramaters.HttpMethod,
                Uri.EscapeDataString(paramaters.NetsuiteUrl.ToLower()),
                Uri.EscapeDataString(rightSide)
            );
    
            var signature = Generate(paramaters.ConsumerSecret, paramaters.TokenSecret, baseString);
    
            return Uri.EscapeDataString(signature);
        }
    
        private string Generate(string consumerSecret, string tokenSecret, string baseString)
        {
            var key = string.Format(
                "{0}&{1}",
                Uri.EscapeDataString(consumerSecret),
                Uri.EscapeDataString(tokenSecret)
            );
    
            var signature = CreateSignature(baseString, key);
    
            return signature;
        }
    
        private string CreateSignature(string data, string key)
        {
            var sha256 = new HMACSHA256(Encoding.ASCII.GetBytes(key));
            var signatureBytes = sha256.ComputeHash(Encoding.ASCII.GetBytes(data));
            return Convert.ToBase64String(signatureBytes);//.UrlEncode();
        }
    
        public int GenerateTimestamp()
        {
            return ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds);
        }
    
        public string GenerateNonce()
        {
            return Guid.NewGuid().ToString().Replace("-", "");
        }
    }
    public class SignatureParamaters
    {
    
        public string ConsumerKey { get; set; }
        public string ConsumerSecret { get; set; }
        public string DeploymentId { get; set; }
        public string HttpMethod { get; set; }
        public string NetsuiteId { get; set; }
        public string NetsuiteUrl { get; set; }
        public string ScriptId { get; set; }
        public string TokenKey { get; set; }
        public string TokenSecret { get; set; }
        public string SignatureMethod { get; set; }
    
    }
    

    My endpoint consists oof ScriptId, DeploymentId parameters.

    string ScriptId = "180", DeploymentId = "1", responsejson = string.Empty;
    
    var myUri = new Uri("https://9459527.restlets.api.netsuite.com/app/restlet.nl?script=" + ScriptId + "&deploy=" + DeploymentId);