Как узнать подпись подписанного URL? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть лямбда, которая генерирует подписанный URL-адрес для пользователей для загрузки файлов в корзину s3. Код находится в nodejs:

export const getSignedURL = async (): Promise<{ signedURL: string }> => {
  try {
    const s3 = new S3();
    const params = {
      Bucket: CONFIG.s3Bucket,
      Key: `${CONFIG.s3PictureFolder}/${uuidv4()}`,
      Expires: CONFIG.presignedURLExpires,
    };
    const signedURL = await s3.getSignedUrlPromise('putObject', params);
    console.log(`generate signedURL url: ${signedURL}`);
    return { signedURL };
  } catch (err) {
    console.error(err);
    throw err;
  }
};

Я могу получить успешный URL-адрес. Однако, когда я тестировал его через curl:

curl -XPUT PRESIGNED_URL --data "my data"

, я получил эту ошибку:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>XXXX</AWSAccessKeyId><StringToSign>

Кажется, что для этого URL-адреса требуется ключ доступа. Означает ли этот ключ AWS ключ учетных данных, который выдается IAM?

Этот URL-адрес был создан лямбда-функцией. Как узнать, какой ключ он использует? И я хотел бы создать заранее созданный URL-адрес publi c для загрузки пользователями. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 10 мая 2020

После отладки я обнаружил, что мне нужно добавить Content-Type при генерации предварительно подписанного URL-адреса, как показано ниже:

const params = {
      Bucket: CONFIG.s3Bucket,
      Key: `${CONFIG.s3PictureFolder}/${uuidv4()}`,
      Expires: CONFIG.presignedURLExpires,
      ContentType: 'text/plain'
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...