访问S3预签名网址时{SignatureDoesNotMatch

时间:2019-03-01 15:49:48

标签: amazon-web-services amazon-s3 aws-lambda pre-signed-url

我创建了一个Lambda函数,以生成预签名的URL,供移动应用程序用户访问S3(非公共)上的pdf文档。

s3 = boto3.client('s3')
    resp = s3.list_objects(
        Bucket='xxxxxxxxx',
        EncodingType='url',
        MaxKeys=1,
        Prefix='2',
        RequestPayer='requester'
    )
    key = resp['Contents'][0]['Key']
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': 'xxxxxxxxx',
            'Key': key,
            'SSECustomerAlgorithm': 'AES256',
            'ResponseContentType': 'application/pdf'
            },
        ExpiresIn=3600,
        HttpMethod='GET'
        )

然后我在浏览器上得到它。

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

据我了解,可以通过HTTP请求进行访问。

带卷曲

curl -X GET https://pre-signedurlhere --output test.pdf

然后

  

无法打开文件“ test.pdf”。它可能已损坏或使用了预览无法识别的文件格式。

1 个答案:

答案 0 :(得分:0)

我不知道使用list_objects_v2是否有任何效果,但是我最终使用以下代码设法从预签名的url中访问文件。没有在AWS上更改任何设置。

    s3 = boto3.client('s3')
    resp = s3.list_objects_v2(
        Bucket='Bucket-name-here',
        MaxKeys=1,
        Prefix='2',
        RequestPayer='requester'
    )
    key = resp['Contents'][0]['Key']
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': '',
            'Key': key,
            'ResponseContentType': 'application/pdf'
            },
        ExpiresIn=3600,
        HttpMethod='GET'
        )