我正在尝试基本上执行图像显示的操作,但我不断得到
The request signature we calculated does not match the signature you provided. Check your key and signing method.
我注意到的一件事是,我的签名比 AWS 在他们的示例中显示的签名短,所以我知道肯定有问题,但我似乎无法弄清楚是什么。
def annotate():
try:
if request.method == 'POST':
pass
unique_filename = str(uuid.uuid4())
file_name_prefix = f"folder_name/{unique_filename}~"
object_name = file_name_prefix+"${filename}"
s3_policy_conditions = [
{"bucket": S3_BUCKET_NAME},
{"acl": "private"},
{"success_action_redirect": "www.success.html"},
{"key":object_name}
]
fields = {"key": file_name_prefix+"${filename}", "acl": "private"}
# Generate presigned post request
encoded_policy = s3.generate_presigned_post(
Bucket=S3_BUCKET_NAME,
Key=object_name,
Fields=fields,
Conditions=s3_policy_conditions,
ExpiresIn=120 # 2 minutes
)
print(encoded_policy)
return render_template('annotate.html',data=encoded_policy)
except Exception as e:
# Handle errors appropriately
error_response = {
'code': 500,
'status': 'error',
'message': str(e)
}
return jsonify(error_response)
这是我的 AWS 签名的代码。下面是我的代码,用于提取我签名的策略并将其用于 POST。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Upload VCF File</h1>
<form id="upload_form"
action="{{ data['url'] }}" method="post"
enctype="multipart/form-data"
>
<input type="hidden" name="key" value="{{ data['fields']['key']~filename }}">
<input type="hidden" name="acl" value="private">
<input type="hidden" name="success_action_redirect" value="vkodagi-hw3.mpcs-cc.com:5000/annotate/files" />
<input type="hidden" name="AWSAccessKeyId" value="{{ data['fields']['AWSAccessKeyId'] }}" />
<input type="hidden" name="policy" value="{{ data['fields']['policy'] | tojson}}" />
<input type="hidden" name="signature" value="{{ data['fields']['signature']}}" />
Select input file: <input id="upload_file" type="file" name="file" />
<input type="submit" value="Upload Input File" />
</form>
</body>
</html>
我做错了什么?为什么我的签名很小?我尝试简单上传到服务器,然后上传到 s3 存储桶,这样就可以了。所以我可以保证我的凭据是正确的。
您的预签名 URL 比您预期的短的最可能原因是您使用的是 v2 签名。
您应该使用 signature v4,可以按如下方式完成(根据需要添加您的凭据):
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))