Создание подписанного URL-адреса S3 с помощью Javascript

Я пытаюсь создать подписанный URL-адрес S3, используя Javascript и NodeJS. Я использовал эту спецификацию.

var crypto     = require('crypto'),
    date       = 1331290899,
    resource   = '/myfile.txt',
    awskey     = "XXXX",
    awssecret  = "XXXX";

var stringToSign ='GET\n\n\n' + date + '\n\n' + resource;

var sig = encodeURIComponent(crypto.createHmac('sha1', awssecret).update(stringToSign ).digest('base64'));

var url = "https://s3-eu-west-1.amazonaws.com/mybucket" +
       resource + "?AWSAccessKeyId=" + awskey + "&Expires="+ date +  
      "&Signature="+ sig

Это создает URL-адрес, подобный этому:

https://s3-eu-west-1.amazonaws.com/mybucket/test.txt?AWSAccessKeyId=XXXXXX&Expires=1331290899&Signature=EciGxdQ1uOqgFDCRon4vPqTiCLc%3D

Однако при доступе к нему я получаю следующую ошибку:

SignatureDoesNotMatch

The request signature we calculated does not match the signature you provided. 
Check your key and signing method.

Что я делаю неправильно при создании подписи?

РЕДАКТИРОВАТЬ - ПОПЫТКА С KNOX

Сейчас я пытаюсь использовать Knox для создания подписанного URL. Мне нужно добавить заголовки с запросом на принудительную загрузку. Я отредактировал следующее:

Добавил amazonHeaders: 'response-content-disposition: attachment', в client.signedUrl- http://jsfiddle.net/BpGNM/1/

Добавлено options.amazonHeaders + '\ n' + в auth.queryStringToSign - http://jsfiddle.net/6b8Tm/

Сообщение, которое сейчас находится отправлено на auth.hmacSha1 для создания подписи:

'GET\n\n\n1321374212\nresponse-content-disposition:attachment\n/meshmesh-dev/test/Readme.md'

Затем я попытался получить доступ к моему новому URL-адресу с помощью response-content-disposition = attachment , добавленного как GET var. Однако я все еще получаю ту же ошибку, о которой говорилось выше.

6
задан Kit 15 November 2011 в 11:33
поделиться