Я хочу, чтобы загрузить мой видеофайл из браузера в хранилище 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;
}
Что может быть причиной ошибки
Как вы строите подпись? Это должен быть HMAC-SHA-1 политики с кодировкой Base-64 с использованием секретного ключа. В соответствии с этими инструкциями: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTForms.html#HTTPPOSTConstructingPolicySignature –
так же, как это: 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