2013-10-30 35 views
5

C# ile REST API kullanarak S3'ten bir dosya almak için bazı kodlar çalışıyorum. Başkalarının benzer şeyler yaptığını gördüm ama bir sebepten dolayı 403 hatası almaya devam ediyorum. AWS SDK ile aynı şeyi yapmaya çalıştım. Net ve işe yarıyor, bu yüzden yetkilendirme başlığını oluşturduğum gibi olduğunu düşünüyorum.Amazon S3 REST API 403 hatası C#

Bu konuda herhangi bir ışık tutabilir mi lütfen?

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

Çalışıyorsa, sdk'yi neden kullanmıyorsunuz? –

+0

Bir SSIS komut dosyası görevine koymayı umuyorum – MarkJ

cevap

1

bu sadece sorun olup olmadığını bilmiyorum, ama bu kesin bir sorun gibi görünür: HTTP isteğinde başlığını:

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

x-amz-date Tarihi supercedes başlığı olan örneklere göre, onun önünde ya da bir şey: kendisi, ancak dizede "x-amz güncel": olmadan, sadece tarih koymak, imzalamak

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

Bir istek için oluşturulabilecek yalnızca bir tane doğru imza var. S3 bu imzayı üretecek ve onu gönderdiğinizle karşılaştıracaktır, bu yüzden dizeden işarete hata için tek bir baytlık oda yok.

+0

Öneriniz için teşekkürler. Değişikliği yaptım ama maalesef hala çalışmıyor. – MarkJ

+0

403 iletisi, imzalanacak dizeyi veren ve imzanın eşleşmediğini bildiren bir hata döndürüyor mu, yoksa hayır mı? Hata ne diyor? (yanıt gövdesinde) –

+0

Hata iletisi, imzanın uyuşmadığını bildiriyor: SignatureDoesNotMatch Hesapladığımız imza imzası, verdiğiniz imzayla eşleşmiyor. Anahtarınızı ve imzalama yönteminizi kontrol edin. MarkJ

1

Kodunuzu test ettim, işe yarıyor! Ekstra bir \ n plus http'a https yapmanız gerekiyor ve işiniz bitti.

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

Amazon Rest API'si iyi bir belgeye sahip değil, örnek olmaması herkesin SDK'ye gitmesini sağlıyor.