向 AWS 请求签名问题

问题描述 投票:0回答:1

我正在尝试基本上执行图像显示的操作,但我不断得到

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 存储桶,这样就可以了。所以我可以保证我的凭据是正确的。

amazon-web-services amazon-s3 boto3
1个回答
0
投票

您的预签名 URL 比您预期的短的最可能原因是您使用的是 v2 签名。

您应该使用 signature v4,可以按如下方式完成(根据需要添加您的凭据):

s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
© www.soinside.com 2019 - 2024. All rights reserved.