python - boto3 签名的 url 导致 SignatureDoesNotMatch

标签 python amazon-s3 boto3

我的代码已成功将文档上传到正确的存储桶中。我可以登录并查看 AWS S3 上的存储桶中的文档。当我尝试使用 boto3 中的generate_signed_url 方法来获取这些文档的 URL,然后将其发送给用户以访问该文档时,我收到一条 SignatureDoesNotMatch 消息,其中显示“我们计算的请求签名与签名不匹配”您提供的。检查您的 key 和签名方法。”

当我保存对象时(通过登录 AWS 并手动下载文件来验证它是否正常工作),我使用:

  s3 = boto3.client('s3', region_name='us-east-2', aws_access_key_id='XXXX', aws_secret_access_key='XXXX', config=Config(signature_version='s3v4'))

  s3.put_object(Bucket=self.bucket_name,Key=path, Body=temp_file.getvalue(),ACL='public-read')

然后,当我尝试获取 URL 时,我使用:

  s3 = boto3.client('s3', region_name='us-east-2', aws_access_key_id='XXXX', aws_secret_access_key='XXXX', config=Config(signature_version='s3v4'))

  url = s3.generate_presigned_url(
        'put_object', Params={
        'Bucket':self.pdffile_storage_bucket_name, 
        'Key':self.pdffile_url
        },
        ExpiresIn=604799,
    )

我在网上看到很多用户都在谈论确保您的 AWS 访问 key 不包含任何特殊字符。我这样做了,但仍然遇到同样的问题。

最佳答案

我尝试了来自许多不同地方的许多解决方案。没有一个对我有用。然后我在 GitHub 上找到了一个对我有用的解决方案。 Here是原来的解决方案,直接复制粘贴他的解决方案即可。

s3 = boto3.client('s3', region_name='us-east-2', aws_access_key_id='XXXX', aws_secret_access_key='XXXX', config=Config(signature_version='s3v4'), endpoint_url='https://s3.us-east-2.amazonaws.com')

关于python - boto3 签名的 url 导致 SignatureDoesNotMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47764171/

相关文章:

python - ansible 支持 boto3 吗?

python - 如何在 python 3.4 中检查数组中元素的字符串

python - 全局名称 'key' 未定义

Python 3 - 计算两个时间值之间的差异

ios - 获取对 AWSS3 对象的引用

php - 提供的 token 格式错误或无效

aws-lambda - 如何使用 boto3 标记 AWS Lambda 函数

python-3.x - 如何使用boto查看EMR现货实例历史价格

python - 如何从列表列表中识别所有相同的列表?

Linux中的Python子进程在文件存在时找不到文件