通过 Postman 呼叫S3预签名URL

7gcisfzg  于 2022-11-07  发布在  Postman
关注(0)|答案(5)|浏览(255)

我正在尝试使用文档(https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html)中描述的预签名URL进行上载。我可以检索预签名URL,但当我尝试在Postman中执行PUT时,收到以下错误:

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

显然,我的put调用的结构方式与AWS计算签名的方式不匹配,我找不到很多关于这个put调用需要什么的信息。
我尝试将Content-Type的头修改为multipart/form-data和application/octet-stream。我还尝试取消postman中的headers部分,并在选择文件的地方依赖于form-data和binary设置的body类型。form-data设置导致以下内容被添加到调用中:
内容处置:如果您有任何问题,请与我们联系。文件名=“要发送的文件. txt
此外,我注意到postman正在包括它所谓的“临时头”如下:
主机:s3.amazonaws.com内容类型:text/plain用户代理:Postman运行时/7.13.0接受:/ 高速缓存控制:无缓存 Postman 令牌:主机:s3.amazonaws.com接受编码:gzip,缩小内容长度:14连接:保活高速缓存控制:无缓存
Content-Type头可能是问题之一,但我不确定如何在postman中排除这些“临时头”。
我在lambda中生成预签名的URL,如下所示:

public string FunctionHandler(Input input, ILambdaContext context)
    { 
        _logger = context.Logger;
        _key = input.key;
        _bucketname = input.bucketname;

        string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
        {
            Verb = HttpVerb.PUT ,
            Protocol = Protocol.HTTPS,
            BucketName = _bucketname,
            Key = _key,
            Expires = DateTime.Now.AddMinutes(5)
        });

        returnObj returnVal = new returnObj() { url = signedURL };

        return JsonConvert.SerializeObject(returnVal);

    }
jtjikinw

jtjikinw1#

您的预签名URL应该类似于https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过 Postman 上传到S3
1.将以上URL设置为终结点
1.选择PUT请求、

  1. Body -〉binary -〉Select file
ttygqcqt

ttygqcqt2#

我可以在Postman中使用POST请求来实现这个功能。下面是对我有用的详细信息。当我调用lambda来获得一个预先签名的URL时,返回的json如下(在我屏蔽了敏感和应用程序特定的信息之后):

{
    "attachmentName": "MySecondAttachment.docx",
    "url": "https://my-s3-bucket.s3.amazonaws.com/",
    "fields": {
        "acl": "public-read",
        "Content-Type": "multipart/form-data",
        "key": "attachment-upload/R271645/65397746_MySecondAttachment.docx",
        "x-amz-algorithm": "AWS4-HMAC-SHA256",
        "x-amz-credential": "WWWWWWWW/20200318/us-east-1/s3/aws4_request",
        "x-amz-date": "20200318T133309Z",
        "x-amz-security-token": "XXXXXXXX",
        "policy": "YYYYYYYY",
        "x-amz-signature": "ZZZZZZZZ"
    }
}

在Postman中,创建一个POST请求,并使用“form-data”输入所有返回的字段,字段名与上面所示的signedURL中返回的字段名完全相同。但是,不要设置内容类型。然后再添加一个名为“file”的键:

如果单击word file右侧的下拉列表,则可以浏览到您的文件并附加它:

为了方便起见,我使用了一个用python编写的lambda来生成一个预先签名的URL,这样用户就可以上传附件了。代码如下所示:

signedURL = self.s3.generate_presigned_post(
    Bucket= "my-s3-bucket",
    Key=putkey,
    Fields = {"acl": "public-read", "Content-Type": "multipart/form-data"},
    ExpiresIn = 15,
    Conditions = [
        {"acl": "public-read"},
        ["content-length-range", 1, 5120000]
        ]
    )

希望这对你有帮助。

r8xiu3jd

r8xiu3jd3#

您的预签名URL应该类似于https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过 Postman 上传到S3
将上面的url设置为端点选择PUT请求,主体-〉二进制-〉选择文件

vc9ivgsu

vc9ivgsu4#

我也面临着同样的问题,下面是它如何为我工作。
请注意,我使用AWS S3 Java SDK制作签名URL,因为我的后端是Java。我在创建此签名URL时将内容类型指定为“application/octet-stream”,以便可以上传任何类型的内容。以下是生成签名URL的Java代码。
如果您有任何问题,请联系我们。如果您有任何问题,请联系我们。如果您有任何问题,请联系我们。如果您有问题,请联系我们。如果您有任何问题,请联系我们。如果您有问题,请联系我们。如果您的请求是空的,则返回空的。返回预定义的请求。如果您有一个新的自定义运行时异常,请使用以下方法:()}}

##现在使用Postman上传文件

1.将生成的url设置为端点
1.选择PUT请求,
1.主体-〉二进制-〉选择文件
1.将头内容类型设置为应用程序/八位字节流 (这一点我之前没有注意到)

omhiaaxx

omhiaaxx5#

这实际上取决于您如何生成URL,
如果使用JAVA生成,
1.将生成的url设置为端点
1.选择PUT请求,
1.主体-〉二进制-〉选择文件x1c 0d1x
如果使用PYTHON生成,
1.创建一个POST请求,并使用form-data输入所有返回的字段,字段名称与上面所示的signedURL中返回的字段名称完全相同。
1.但是,不要设置内容类型,然后再添加一个名为“file”的键:
参考已接受的答案图片

相关问题