2015-05-15 3 views
0

Я хочу, чтобы загрузить мой видеофайл из браузера в хранилище Amazon S3 через проект asp.net. Но я продолжаю получать эту ошибку: «Подписанная нами подпись запроса не соответствует подписи, которую вы предоставили»Подписанная нами подпись запроса не соответствует подписи, которую вы предоставили aws.

Вот код javascript, который у меня есть;

function uploadFile() { 

var access_key = "xx"; 
var secret = "xx"; 
var policy = "xx"; 
var signature = "xx"; 

var file = document.getElementById('file').files[0]; 
var fd = new FormData(); 

var key = "folder1/" + (new Date).getTime() + '-' + file.name; 

fd.append('key', key); 
fd.append('acl', 'public-read-write'); 
fd.append('Content-Type', file.type); 
fd.append('AWSAccessKeyId', access_key); 
fd.append('policy', policy) 
fd.append('signature', signature); 

fd.append("file", file); 

var xhr = new XMLHttpRequest(); 

xhr.upload.addEventListener("progress", uploadProgress, false); 
xhr.addEventListener("load", uploadComplete, false); 
xhr.addEventListener("error", uploadFailed, false); 
xhr.addEventListener("abort", uploadCanceled, false); 

xhr.open('POST', 'https://bucketName.s3.amazonaws.com/', true); 

xhr.send(fd); 

}

Вот строка политики;

{" + 
         "\"Id\": \"Policyxxx\"," + 
         "\"Version\": \"2012-10-17\"," + 
         "\"Statement\": [" + 
         "{" + 
          "\"Sid\": \"Stmtxxx\"," + 
          "\"Action\": \"s3:*\"," + 
          "\"Effect\": \"Allow\"," + 
          "\"Resource\": \"arn:aws:s3:::bucketName/*\"," + 
          "\"Principal\": \"*\"" + 
         "}" + 
         "]" + 
        "} 

и здесь метод getignature;

public static string GetS3Signature(string policyStr) 
    { 
     string b64Policy = Convert.ToBase64String(Encoding.ASCII.GetBytes(policyStr)); 

     byte[] b64Key = Encoding.ASCII.GetBytes(AwsSecretKey); 
     HMACSHA1 hmacSha1 = new HMACSHA1(b64Key); 

     var c = Convert.ToBase64String(hmacSha1.ComputeHash(Encoding.ASCII.GetBytes(b64Policy))); 
     return c; 
    } 

Что может быть причиной ошибки

+0

Как вы строите подпись? Это должен быть HMAC-SHA-1 политики с кодировкой Base-64 с использованием секретного ключа. В соответствии с этими инструкциями: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTForms.html#HTTPPOSTConstructingPolicySignature –

+0

так же, как это: string b64Policy = Convert.ToBase64String (Encoding.ASCII.GetBytes (policyStr)); byte [] b64Key = Encoding.ASCII.GetBytes (AwsSecretKey); HMACSHA1 hmacSha1 = новый HMACSHA1 (b64Key); var c = Convert.ToBase64String (hmacSha1.ComputeHash (Encoding.ASCII.GetBytes (b64Policy))); return c; – tuncay

ответ

0

Любых условий, которые упомянуты в политике также должна быть в данной форме. Например, если у вас есть такое состояние, как

["starts-with", "x-amz-meta-myelement", ""] 

Тогда вам нужно отправить этот ключ. Если у политики есть ограничения на тип содержимого или префикс ключа, это может также вызвать ошибки подписи.

+0

Привет @Jim, Вот строка политики: "\" Id \ ": \" Policyxxx \ "," + "\" Версия \ ": \" 2012-10-17 \ "," + "\ "Statement \": ["+ " {"+ " \ "Sid \": \ "Stmtxxx \", "+ " \ "Действие \": \ "s3: * \", "+ " \ "Эффект \": \ "Разрешить \", "+ " \ "Ресурс \": \ "arn: aws: s3 ::: bucketName/* \", "+ " \ "Principal \": \ "* \ "" + "}" + "]" – tuncay

+0

У меня нет условий .. Я уточнил вопрос для получения более подробной информации о коде. – tuncay

+0

Это похоже на политику IAM. Политики, используемые с подписанными политиками POST, несколько отличаются. Для некоторых примеров см. Http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html. –