Подпись DoesNotMatch на многочастном загрузчике Amazon S3 - PullRequest
3 голосов
/ 23 июня 2011

Я работаю над многочастным загрузчиком AS3.Я использую эту документацию http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html для создания подписи.Вот мой пример:

Запрос:

POST /btnOK.png?uploads HTTP/1.1
Referer: app:/Main.swf
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, text/css, image/png, image/jpeg, image/gif;q=0.8, application/x-shockwave-flash, video/mp4;q=0.9, flv-application/octet-stream;q=0.8, video/x-flv;q=0.7, audio/mp4, application/futuresplash, */*;q=0.5
x-flash-version: 10,1,53,64
Date: Thu, 23 Jun 2011 09:03:18 GMT
Authorization: AWS accesskey:signature
Content-Type: image/png
User-Agent: Mozilla/5.0 (Windows; U; en-US) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.0.2
Host: bucketname.s3.amazonaws.com
Content-Length: 0
Connection: Keep-Alive

Текст без подписи:

POST\n
\n
image/png\n
Thu, 23 Jun 2011 09:03:18 GMT
/bucketname/btnOK.png?uploads

И я получаю в ответ следующую ошибку: SignatureDoesNotMatch: подпись запроса, которую мы вычислилине соответствует подписи, которую вы предоставили.Проверьте свой ключ и метод подписи.

Отсутствуют ли некоторые заголовки в неподписанном тексте?Может быть, Referer, Accept и т. Д. Должны быть в неподписанном тексте?

Я использую тестер подписи Amazon S3 в JavaScript (http://aws.amazon.com/code/199) и получаю тот же неподписанный текст.Может быть, проблема в шифровании?Я использую библиотеку as3crypto.Вот мой код AS3 для этого:

private function generateSignature(datas:String, securityKey:String):String {

    var sha:SHA1 = new SHA1();
    var securityKeyArray:ByteArray = new ByteArray();
    securityKeyArray.writeUTFBytes(escape(securityKey));
    sha.hash(securityKeyArray);

    var hmac:HMAC = new HMAC(sha);
    var datasArray:ByteArray = new ByteArray();
    datasArray.writeUTFBytes(escape(datas));

    var signatureArray:ByteArray = new ByteArray();
    signatureArray = hmac.compute(securityKeyArray, datasArray);

    return Base64.encodeByteArray(signatureArray);
}

Пожалуйста, помогите!Спасибо!

...