【问题标题】:How I know the signature of a signed url?我怎么知道签名网址的签名?
【发布时间】:2020-08-25 00:37:19
【问题描述】:

我有一个 lambda,它为用户生成一个签名 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 似乎需要访问密钥。此密钥是否表示由 IAM 颁发的 AWS 凭证密钥?

此 URL 由 lambda 函数生成。我怎么知道它使用哪个键?我想生成一个公开的预签名网址供用户上传。有没有办法做到这一点?

【问题讨论】:

  • 你能告诉我们签名的 URL 是什么样的吗? (随意修改它以隐藏个人信息。)它应该包含所有必要的信息。
  • 不,您的 AWS 凭证在生成 URL 时使用,但一旦创建,该 URL 是“公共的” - 任何人都可以使用它,无需额外的密钥。有几个可能的原因,但最有可能是存储桶或键值中的简单格式/编码问题。

标签: amazon-web-services amazon-s3


【解决方案1】:

经过调试,发现生成预签名URL时需要添加Content-Type

const params = {
      Bucket: CONFIG.s3Bucket,
      Key: `${CONFIG.s3PictureFolder}/${uuidv4()}`,
      Expires: CONFIG.presignedURLExpires,
      ContentType: 'text/plain'
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2023-03-25
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多