如何从 `ibm_boto3` 调用 `generate_presigned_post`?

how do I call `generate_presigned_post` from `ibm_boto3`?

我在 Web 界面上创建凭据(尝试了 write 和 manager)并包含 {"HMAC":true}

我已经使用这些凭据成功地执行了更多基本操作,例如 put_objectupload_file

但是,我无法让 generate_presigned_post 工作。它会生成以下错误:

ibm_botocore.exceptions.UnsupportedSignatureVersionError: Signature version is not supported: oauth-presign-post

我运行下面的代码,

import ibm_boto3
from ibm_botocore.client import Config

class COSPresignedURL():
    def __init__(self, config):
        cfg = Config(signature_version='oauth', s3={"payload_signing_enabled":True})
        self.cos = ibm_boto3.client(
            's3',
            ibm_api_key_id=config['api_key'],
            ibm_service_instance_id=config['instance_id'],
            ibm_auth_endpoint=config['auth_endpoint'],
            endpoint_url=config['url_endpoint'],
            config=cfg)

    def generate(self, bucket, key, Fields=None, Conditions=None, ExpiresIn=300):
        return self.cos.generate_presigned_post(bucket, key, Fields, Conditions, ExpiresIn)


def main():
    config = {
        "api_key" : "VALUE OF apikey FROM CLOUD CREDENTIALS",
        "instance_id" : "VALUE OF resource_instance_id FROM CLOUD CREDENTIALS",
        "auth_endpoint" : "https://iam.cloud.ibm.com/identity/token",
        "url_endpoint" : "https://s3.eu-de.cloud-object-storage.appdomain.cloud"
    }

    bucket = 'somebucket'

    poster = COSPresignedURL(config)
    uri = poster.generate(bucket, 'somekey')
    print(f'{uri}')


if __name__ == '__main__':
    main()

完整生成以下错误,

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ibm_botocore/signers.py", line 149, in sign
    auth = self.get_auth_instance(**kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ibm_botocore/signers.py", line 222, in get_auth_instance
    signature_version=signature_version)
ibm_botocore.exceptions.UnknownSignatureVersionError: Unknown Signature Version: oauth-presign-post.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 35, in <module>
    main()
  File "tmp.py", line 30, in main
    uri = poster.generate(bucket, 'somekey')
  File "tmp.py", line 16, in generate
    return self.cos.generate_presigned_post(bucket, key, Fields, Conditions, ExpiresIn)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ibm_botocore/signers.py", line 714, in generate_presigned_post
    expires_in=expires_in)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ibm_botocore/signers.py", line 526, in generate_presigned_post
    'PutObject', request, region_name, 'presign-post')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ibm_botocore/signers.py", line 153, in sign
    signature_version=signature_version)
ibm_botocore.exceptions.UnsupportedSignatureVersionError: Signature version is not supported: oauth-presign-post

我的工作方式如下。当我创建客户端并连接到 COS 端点时,我的最终调用如下所示:

theURL=cos.generate_presigned_url('get_object',
                                   Params = {'Bucket': buckets[0],
                                             'Key': objects[0] 
                                            },
                                   ExpiresIn = 100)

我好像用不同的参数使用那个函数。我构建了 cos 对象,如下所示:

cos = ibm_boto3.client('s3',
                        config["apikey"],
                        endpoint_url='https://'+cos_host,
                        aws_access_key_id=config["cos_hmac_keys"["access_key_id"],
                        aws_secret_access_key=config["cos_hmac_keys"]["secret_access_key"])

如您所见,我传递了 HMAC 详细信息。