我怎么知道签名网址的签名?
Posted
技术标签:
【中文标题】我怎么知道签名网址的签名?【英文标题】: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 是“公共的” - 任何人都可以使用它,无需额外的密钥。有几个可能的原因,但最有可能是存储桶或键值中的简单格式/编码问题。 【参考方案1】:经过调试,发现生成预签名URL时需要添加Content-Type
:
const params =
Bucket: CONFIG.s3Bucket,
Key: `$CONFIG.s3PictureFolder/$uuidv4()`,
Expires: CONFIG.presignedURLExpires,
ContentType: 'text/plain'
;
【讨论】:
以上是关于我怎么知道签名网址的签名?的主要内容,如果未能解决你的问题,请参考以下文章