【发布时间】: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