2017-11-19 1 views
0

OAuth (http://apidev.bricklink.com/redmine/projects/bricklink-api/wiki/Authorization)를 사용하여 Bricklink REST API에 연결하려고합니다.C#을 사용하는 REST API 인증 (OAuth 1.0)

아주 간단합니다. 그러나 현재 막혀 있고 SIGNATURE_INVALID 오류가 계속 발생합니다. 내 현재 시도는 아래와 같습니다. 어떤 제안?

 const string consumerKey = ""; 
     const string consumerSecret = ""; 
     const string tokenSecret = ""; 
     const string tokenValue = ""; 
     const string url = "https://api.bricklink.com/api/store/v1/items/part/3001"; 

     var httpWebRequest = (HttpWebRequest) WebRequest.Create(url); 
     httpWebRequest.Method = "GET"; 

     var timeStamp = ((int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); 
     var nonce = Convert.ToBase64String(Encoding.UTF8.GetBytes(timeStamp)); 

     var signatureBaseString = httpWebRequest.Method.ToUpper() + "&"; 
     signatureBaseString = signatureBaseString + url.ToLower() + "&"; 
     signatureBaseString = signatureBaseString + "oauth_consumer_key=" + consumerKey + "&"; 
     signatureBaseString = signatureBaseString + "oauth_nonce=" + nonce + "&"; 
     signatureBaseString = signatureBaseString + "oauth_signature_method=" + "HMAC-SHA1" + "&"; 
     signatureBaseString = signatureBaseString + "oauth_timestamp=" + timeStamp + "&"; 
     signatureBaseString = signatureBaseString + "oauth_token=" + tokenValue + "&"; 
     signatureBaseString = signatureBaseString + "oauth_version=" + "1.0"; 
     signatureBaseString = Uri.EscapeDataString(signatureBaseString); 
     Console.WriteLine(signatureBaseString); 

     var signatureEncoding = new ASCIIEncoding(); 
     var keyBytes = signatureEncoding.GetBytes(consumerSecret + "&" + tokenSecret); 
     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); 
     Console.WriteLine(signatureString); 

     string SimpleQuote(string x) => '"' + x + '"'; 
     var header = 
      "OAuth realm=" + SimpleQuote("") + "," + 
      "oauth_consumer_key=" + SimpleQuote(consumerKey) + "," + 
      "oauth_nonce=" + SimpleQuote(nonce) + "," + 
      "oauth_signature_method=" + SimpleQuote("HMAC-SHA1") + "," + 
      "oauth_timestamp=" + SimpleQuote(timeStamp) + "," + 
      "oauth_token=" + SimpleQuote(tokenValue) + "," + 
      "oauth_version=" + SimpleQuote("1.0") + "," + 
      "oauth_signature= " + SimpleQuote(signatureString); 
     Console.WriteLine(header); 
     httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, header); 

     var response = httpWebRequest.GetResponse(); 
     var characterSet = ((HttpWebResponse) response).CharacterSet; 
     var responseEncoding = characterSet == "" 
      ? Encoding.UTF8 
      : Encoding.GetEncoding(characterSet ?? "utf-8"); 
     var responsestream = response.GetResponseStream(); 
     if (responsestream == null) 
     { 
      throw new ArgumentNullException(nameof(characterSet)); 
     } 
     using (responsestream) 
     { 
      var reader = new StreamReader(responsestream, responseEncoding); 
      var result = reader.ReadToEnd(); 
      Console.WriteLine(result); 
     } 

는 내가 자바 스크립트를 사용하여 bricklink-API (https://www.npmjs.com/package/bricklink-api)를 사용하여 연결할 수 consumerKey, consumerSecret, tokenSecret 및 tokenValue이 올 것을 알고있다.

답변

0

다시 https://oauth.net/core/1.0/#signing_process을 공부 한 후 마침내 올바르게되었습니다. 참고로, 이스케이프 기능은 필수적이지 않습니다. 나는 일을 만들려고하면서 우연히 발견했습니다.

 const string consumerKey = ""; 
     const string consumerSecret = ""; 
     const string tokenSecret = ""; 
     const string tokenValue = ""; 
     const string url = "https://api.bricklink.com/api/store/v1/items/part/3001"; 

     string Escape(string s) 
     { 
      // https://stackoverflow.com/questions/846487/how-to-get-uri-escapedatastring-to-comply-with-rfc-3986 
      var charsToEscape = new[] {"!", "*", "'", "(", ")"}; 
      var escaped = new StringBuilder(Uri.EscapeDataString(s)); 
      foreach (var t in charsToEscape) 
      { 
       escaped.Replace(t, Uri.HexEscape(t[0])); 
      } 
      return escaped.ToString(); 
     } 

     var httpWebRequest = (HttpWebRequest) WebRequest.Create(url); 
     httpWebRequest.Method = "GET"; 

     var timeStamp = ((int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); 
     var nonce = Convert.ToBase64String(Encoding.UTF8.GetBytes(timeStamp)); 

     var signatureBaseString = Escape(httpWebRequest.Method.ToUpper()) + "&"; 
     signatureBaseString += EscapeUriDataStringRfc3986(url.ToLower()) + "&"; 
     signatureBaseString += EscapeUriDataStringRfc3986(
      "oauth_consumer_key=" + EscapeUriDataStringRfc3986(consumerKey) + "&" + 
      "oauth_nonce=" + EscapeUriDataStringRfc3986(nonce) + "&" + 
      "oauth_signature_method=" + EscapeUriDataStringRfc3986("HMAC-SHA1") + "&" + 
      "oauth_timestamp=" + EscapeUriDataStringRfc3986(timeStamp) + "&" + 
      "oauth_token=" + EscapeUriDataStringRfc3986(tokenValue) + "&" + 
      "oauth_version=" + EscapeUriDataStringRfc3986("1.0")); 
     Console.WriteLine(@"signatureBaseString: " + signatureBaseString); 

     var key = EscapeUriDataStringRfc3986(consumerSecret) + "&" + EscapeUriDataStringRfc3986(tokenSecret); 
     Console.WriteLine(@"key: " + key); 
     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 = EscapeUriDataStringRfc3986(signatureString); 
     Console.WriteLine(@"signatureString: " + signatureString); 

     string SimpleQuote(string s) => '"' + s + '"'; 
     var header = 
      "OAuth realm=" + SimpleQuote("") + "," + 
      "oauth_consumer_key=" + SimpleQuote(consumerKey) + "," + 
      "oauth_nonce=" + SimpleQuote(nonce) + "," + 
      "oauth_signature_method=" + SimpleQuote("HMAC-SHA1") + "," + 
      "oauth_timestamp=" + SimpleQuote(timeStamp) + "," + 
      "oauth_token=" + SimpleQuote(tokenValue) + "," + 
      "oauth_version=" + SimpleQuote("1.0") + "," + 
      "oauth_signature= " + SimpleQuote(signatureString); 
     Console.WriteLine(@"header: " + header); 
     httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, header); 

     var response = httpWebRequest.GetResponse(); 
     var characterSet = ((HttpWebResponse) response).CharacterSet; 
     var responseEncoding = characterSet == "" 
      ? Encoding.UTF8 
      : Encoding.GetEncoding(characterSet ?? "utf-8"); 
     var responsestream = response.GetResponseStream(); 
     if (responsestream == null) 
     { 
      throw new ArgumentNullException(nameof(characterSet)); 
     } 
     using (responsestream) 
     { 
      var reader = new StreamReader(responsestream, responseEncoding); 
      var result = reader.ReadToEnd(); 
      Console.WriteLine(@"result: " + result); 
     }