Я пытаюсь сгенерировать предустановленный PUT с помощью boto3, чтобы загрузить файл в хранилище scality s3 со следующим кодом:
s3_params = dict(service_name='s3',
endpoint_url=endpoint,
aws_access_key_id=key,
aws_secret_access_key=secret,
verify=certif_path,
config=boto3.session.Config(s3={'addressing_style': 'path'}, signature_version='s3v4'))
self._s3_client = session.client(**s3_params)
self._s3_client.generate_presigned_url(method_name, Params={'Bucket': self.bucket, 'Key': path}, ExpiresIn=3600)
Это на самом деле прекрасно работает при использовании его с запросом:
requests.put(presigned_put_url, open(my_file, 'rb'), verify=certif) # 200
Но как только я пытаюсь использовать сгенерированный URL на Postman или с axios в браузере, я получаю
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided.</Message>
<Resource></Resource>
<RequestId>11ecabdb024990d420e5</RequestId>
</Error>
Я попробовал несколько решений, таких как добавление config =boto3.session.Config (s3 = {'addressing_style': 'path'}, signature_version = 's3v4')) в мою конфигурацию s3 или добавление ContentType 'application / octet-stream' при создании URL-адреса и при выполнении запроса. Я пытался обновить версию boto3. Я пытался отключить автоматическое добавление заголовков Postman.
Но я все еще получаю сообщение об ошибке, не понимая, почему.
Спасибо
РЕДАКТИРОВАТЬ
Фактически найден источник ошибки, в нашей конечной точке scality есть номер порта.
При использовании запросов Python или cURL заголовок хоста устанавливается без порта, и запрос работает.
С другой стороны, при использовании XHR или Почтальона заголовок хоста устанавливается с номером порта, и я получаю вышеупомянутое исключение.