使用Django+Boto3生成S3预签名URL遇授权参数错误求助
我使用Django开发应用,媒体文件托管在AWS S3桶中,应用内保存和展示均正常。但需要生成图片URL用于邮件,于是用boto3编写了生成预签名URL的代码,点击生成的URL时出现AuthorizationQueryParametersError错误。
生成预签名URL的代码
import boto3 from decouple import config AWS_ACCESS_KEY_ID = config("AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = config("AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = 'wiini' AWS_S3_REGION_NAME = 'ca-central-1' AWS_S3_SIGNATURE_NAME = 's3v4' AWS_S3_FILE_OVERWRITE = False def get_s3_favicon_url(): s3_client = boto3.client( 's3', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=AWS_S3_REGION_NAME, config=boto3.session.Config(signature_version=AWS_S3_SIGNATURE_NAME) ) favicon_key = 'favicon-32x32.png' url = s3_client.generate_presigned_url( 'get_object', Params={'Bucket': AWS_STORAGE_BUCKET_NAME, 'Key': favicon_key}, ExpiresIn=3600, # 设置合适的过期时间(秒) HttpMethod='GET', # 指定HTTP方法 ) print("Generated URL:", url) return url
完整错误信息
This XML file does not appear to have any style information associated with it. The document tree is shown below. <Error> <Code>AuthorizationQueryParametersError</Code> <Message>Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.</Message> <RequestId>MBZZHKZF2ZJEGNJ2</RequestId> <HostId>1u9Jg6UQWPsdbmN2Qh88HYhsVNILR3CY58RzIMu3Be6FALR6D8qu+GnLEND/Mwee4Mkx0p7zoR8=</HostId> </Error>
解决方法
- 调整客户端签名配置:将signature_version直接在boto3.client初始化时指定,替代原来的config参数写法,避免配置传递异常:
s3_client = boto3.client( 's3', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=AWS_S3_REGION_NAME, signature_version='s3v4' ) - 验证权限与区域:确保AWS凭证对应的IAM用户拥有
s3:GetObject权限,同时确认AWS_S3_REGION_NAME与S3桶实际所在区域完全一致。 - 升级依赖包:如果使用的boto3或botocore版本过低,可能存在签名生成的bug,执行以下命令升级:
pip install --upgrade boto3 botocore - 检查生成的URL参数:生成后确认URL包含
X-Amz-Algorithm、X-Amz-Credential等所有要求的参数,若缺失则说明生成过程存在异常,需排查代码或依赖问题。
内容的提问来源于stack exchange,提问作者Pourya Mohamadi
相关产品推荐
相关产品推荐

