как мне вызвать `generate_presigned_post` из` ibm_boto3`? - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю учетные данные (пробовал писать и использовать менеджер) в веб-интерфейсе и включаю {"HMAC":true}

Я использовал эти учетные данные для более простых действий, таких как put_object и upload_file, успешно.

Однако я не могу заставить generate_presigned_post работать.Он генерирует следующую ошибку:

ibm_botocore.exceptions.UnsupportedSignatureVersionError: Версия подписи не поддерживается: 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

1 Ответ

0 голосов
/ 19 сентября 2019

У меня это работает следующим образом.Когда я создал клиента и подключился к конечной точке 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...