Netsuite oAuth 1.0 Get API 与 HTTPCLIENT 的集成

问题描述 投票:0回答:1

Postman Screenshot1 Postman Screenshot2

我目前正在致力于将 OAuth 1.0 身份验证集成到我的 C# Web API 项目中。我需要使用 HMAC-SHA256 签名方法,并且在生成正确的 OAuth 标头时遇到问题。 我需要将 ConsumerKey、consumerSecret、accessToken、accessTokenSecret、realm 传递给请求标头,并且我不应该使用标头发送时间戳和随机数

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;

   }
 } 

c# authentication asp.net-web-api oauth-1.0a hmacsha256
1个回答
0
投票
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; }

}
© www.soinside.com 2019 - 2024. All rights reserved.