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