2013-10-30 5 views
5

मैं सी # के माध्यम से आरईएसटी एपीआई का उपयोग कर एस 3 से फाइल लाने के लिए कुछ कोड प्राप्त करने की कोशिश कर रहा हूं। मैंने अन्य लोगों को समान चीजें करने के लिए देखा है लेकिन किसी कारण से मुझे 403 त्रुटि मिल रही है। मैंने एडब्ल्यूएस एसडीके के साथ एक ही काम करने की कोशिश की है। नेट और यह काम करता है इसलिए मुझे लगता है कि मैं प्राधिकरण शीर्षलेख बना रहा हूं।अमेज़ॅन एस 3 आरईएसटी एपीआई 403 त्रुटि सी #

क्या कोई इस पर कोई प्रकाश डालने में सक्षम है?

string awsAccessId = "***"; 
string awsSecretKey = "***"; 
string bucketName = "thebucket"; 

string httpDate = DateTime.Now.ToString("ddd, dd MMM yyyy HH:mm:ss +0000\n"); 
       string canonicalString = "GET\n" 
             + "\n" 
             + "\n" 
             + "x-amz-date:" + httpDate + "\n" 
             + "/" + bucketName + "/readme.txt"; 

       // now encode the canonical string 
       Encoding ae = new UTF8Encoding(); 
       // create a hashing object 
       HMACSHA1 signature = new HMACSHA1(); 
       // secretId is the hash key 
       signature.Key = ae.GetBytes(awsSecretKey); 
       byte[] bytes = ae.GetBytes(canonicalString); 
       byte[] moreBytes = signature.ComputeHash(bytes); 
       // convert the hash byte array into a base64 encoding 
       string encodedCanonical = Convert.ToBase64String(moreBytes); 

       // Send the request 
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://" + bucketName +".s3.amazonaws.com/readme.txt"); 
       request.Headers.Add("x-amz-date", httpDate); 
       request.Headers.Add("Authorization", "AWS " + awsAccessId + ":" + encodedCanonical); 
       request.Method = "GET"; 

       // Get the response 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       Console.WriteLine(response.StatusCode); 
       Console.Read(); 
+0

यदि यह काम करता है तो एसडीके का उपयोग क्यों नहीं करें? –

+0

मैं इसे अपने सुझाव के लिए धन्यवाद एक एसएसआईएस स्क्रिप्ट कार्य – MarkJ

उत्तर

1

अगर यह केवल समस्या यह है मैं नहीं जानता, लेकिन यह एक निश्चित समस्या की तरह दिखता है: HTTP अनुरोध में शीर्ष लेख:

+ "x-amz-date:" + httpDate + "\n" 

x-amz-date हैडर कि दिनांक अधिरेखित है ही है, लेकिन स्ट्रिंग प्रवेश करने के लिए, तो आप सिर्फ तारीख डाल दिया, बिना "एक्स-AMZ की तारीख:" या इसे के सामने कुछ भी, उदाहरण के अनुसार:

GET\n 
\n 
\n 
Tue, 27 Mar 2007 19:36:42 +0000\n 
/johnsmith/photos/puppy.jpg 

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationRequestCanonicalization

अनुरोध के लिए केवल एक ही सही हस्ताक्षर उत्पन्न किया जा सकता है। एस 3 उस हस्ताक्षर उत्पन्न करने जा रहा है, और इसे आपके द्वारा भेजे गए एक से तुलना करें, इसलिए स्ट्रिंग-टू-साइन में त्रुटि के लिए कमरे का एक बाइट नहीं है।

+0

में रखने की उम्मीद कर रहा हूं। मैंने संशोधन किया लेकिन दुर्भाग्य से यह अभी भी काम नहीं करता है। – MarkJ

+0

क्या 403 संदेश एक त्रुटि लौटा रहा है जो आपको हस्ताक्षर करने के लिए स्ट्रिंग देता है और आपको बताता है कि हस्ताक्षर मेल नहीं खाता है, या नहीं? त्रुटि क्या कहती है? (प्रतिक्रिया शरीर में) –

+0

त्रुटि संदेश यह बता रहा है कि हस्ताक्षर मेल नहीं खाता है: SignatureDoesNotMatch आपके द्वारा प्रदत्त अनुरोध हस्ताक्षर आपके द्वारा प्रदान किए गए हस्ताक्षर से मेल नहीं खाता है। अपनी कुंजी और हस्ताक्षर विधि की जांच करें। MarkJ

1

मैंने आपके कोड का परीक्षण किया, यह काम करता है! आपको बस एक अतिरिक्त \ n प्लस http को https में बदलना होगा और आप कर चुके हैं।

string stringToConvert = "GET\n" 
          + "\n" 
          + "\n" 
          + "\n" 
          + "x-amz-date:" + timeStamp + "\n" 
          + "/" + bucketName + "/" + FileName; 

अमेज़न बाकी एपीआई एक अच्छा प्रलेखन की जरूरत नहीं है, उदाहरण के अभाव हर कोई एसडीके के बजाय जाना पड़ता है।

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