2015-06-08 8 views
5

प्रश्न
हैलो, मैं एक API जो को प्रमाणित करने की जरूरत है OAuth एन्क्रिप्शन की जरूरत है।
मैं सही दिशा में हूं लेकिन मुझे यकीन है कि मेरे हस्ताक्षर बेस स्ट्रिंग में कुछ गड़बड़ है। चूंकि HMACSHA1 हैश एक कुंजी और बेसस्ट्रिंग पर आधारित है, इसलिए मुझे गलत oauth_signature मिलता है।
OAuth Signing ProcessHMAC-SHA1 एन्क्रिप्शन के साथ OAuth हस्ताक्षर बनाएं रिटर्न HTTP 401

अब तक
मैं, डेटा के सभी आवश्यक टुकड़े इकट्ठा करने के लिए जो भी शामिल कर पाए हैं:

  • ग्राहक कुंजी
  • उपभोक्ता रहस्य
  • पहुंच टोकन
  • एक्सेस गुप्त
  • Sha1Hased मूल्य (कुंजी और संदेश के आधार पर, जहां संदेश है हस्ताक्षर बेस स्ट्रिंग)
  • हस्ताक्षर बेस स्ट्रिंग

समस्या
मैं एक HTTP प्राप्त (401 गलत अनुरोध) की वजह से लौटे एक अवैध हस्ताक्षर।
नोट: मुझे पूरा यकीन है कि मैं अपना हस्ताक्षर बेस स्ट्रिंग कैसे बना सकता हूं। मेरे द्वारा उपयोग किए गए API डॉक्स के बारे में जानकारी के लिए, कृपया नीचे पृष्ठ देखें।

कोड

GetOAuthToken (वास्तविक अनुरोध कर)

public static string GetAuthorizationToken() 
{ 
    string TimeInSecondsSince1970 = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); 
    string Nonce = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(TimeInSecondsSince1970 
    + TimeInSecondsSince1970 + TimeInSecondsSince1970)); 
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(GetAppleApiUrl.GetUrl(AppleApiUrl.SESSION_TOKEN)); 
    httpWebRequest.Method = "GET"; 

    string consumer_secret = Uri.EscapeDataString(Settings.SettingsManager.consumer_secret); 
    string token_secret = Uri.EscapeDataString(Settings.SettingsManager.access_secret); 

    string signature_base_string = GetSignatureBaseString(TimeInSecondsSince1970, Nonce); 
    string SHA1HASH = GetSha1Hash(consumer_secret + "&" + token_secret, signature_base_string); 

    string Header = 
     "OAuth realm=" + '"' + "ADM" + '"' + "," + 
     "oauth_consumer_key=" + '"' + Settings.SettingsManager.consumer_key + '"' + "," + 
     "oauth_token=" + '"' + Settings.SettingsManager.access_token + '"' + "," + 
     "oauth_signature_method=" + '"' + "HMAC-SHA1" + '"' + "," + 
     "oauth_signature= " + '"' + SHA1HASH + '"' + "," + 
     "oauth_timestamp=" + '"' + TimeInSecondsSince1970 + '"' + "," + 
     "oauth_nonce=" + '"' + Nonce + '"' + "," + 
     "oauth_version=" + '"' + "1.0" + '"' + ","; 

    httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, Header); 
    var Result = httpWebRequest.GetResponse(); 

    return Result.ToString(); 
} 

GetSha1Hash

public static string GetSha1Hash(string key, string message) 
{ 
    var encoding = new System.Text.ASCIIEncoding(); 

    byte[] keyBytes = encoding.GetBytes(key); 
    byte[] messageBytes = encoding.GetBytes(message); 

    string Sha1Result = string.Empty; 

    using (HMACSHA1 SHA1 = new HMACSHA1(keyBytes)) 
    { 
     var Hashed = SHA1.ComputeHash(messageBytes); 
     Sha1Result = Convert.ToBase64String(Hashed); 
    } 

    return Sha1Result; 
} 

GetSignatureBaseString

public static string GetSignatureBaseString(string TimeStamp, string Nonce) 
{ 
    //1.Convert the HTTP Method to uppercase and set the output string equal to this value. 
    string Signature_Base_String = "Get"; 
    Signature_Base_String = Signature_Base_String.ToUpper(); 

    //2.Append the ‘&’ character to the output string. 
    Signature_Base_String = Signature_Base_String + "&"; 

    //3.Percent encode the URL and append it to the output string. 
    string PercentEncodedURL = Uri.EscapeDataString(GetAppleApiUrl.GetUrl(AppleApiUrl.SESSION_TOKEN)); 
    Signature_Base_String = Signature_Base_String + PercentEncodedURL; 

    //4.Append the ‘&’ character to the output string. 
    Signature_Base_String = Signature_Base_String + "&"; 

    //5.append parameter string to the output string. 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("oauth_consumer_key=" + Settings.SettingsManager.consumer_key); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_token=" + Settings.SettingsManager.access_token); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_signature_method=" +"HMAC-SHA1"); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_timestamp=" + TimeStamp); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_nonce=" + Nonce); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_version=" + "1.0"); 

    return Signature_Base_String; 
} 

परिणाम (फ़िडलर) Fiddler Result
एपीआई डॉक्टर enter image description here

+0

https://msdn.microsoft.com/en-us/library/system.security इस उपयोग करने का प्रयास के रूप में .cryptography.hmacsha1 (v = vs.110) .aspx? cs-save-lang = 1 और cs-lang = csharp # code-snippet-1 – daehaai

+0

पर हस्ताक्षर करने के लिए @PreyashDesai - वही प्रतिक्रिया (400)। हालांकि एक अलग हैश उत्पन्न हुआ .. मैं SHA1 प्रबंधित पर HMACSHA1 का उपयोग क्यों करूं? –

+1

देखें http://blog.aggregatedintelligence.com/2007/10/fips- validated-cryptographic-algorithms.html SHA1 प्रबंधित एचएएमएसीएसए 1 है जबकि FIPS अनुरूप नहीं है। लेकिन यह आपकी समस्या को ठीक नहीं करता है। – daehaai

उत्तर

3

ऐसा लगता है कि आप Header स्ट्रिंग में वर्णानुक्रम मानकों को सॉर्ट और GetSignatureBaseString विधि के भीतर होना चाहिए this comment में वर्णित है और Twitter OAuth documentation

+0

मैं इसे 22 घंटे में पुरस्कृत कर सकता हूं। –

संबंधित मुद्दे