SignatureDoesNotMatch при доступе к предварительно подписанному URL-адресу S3 - PullRequest
0 голосов
/ 01 марта 2019

Я создал функцию Lambda для генерации предварительно подписанного URL-адреса для пользователей мобильных приложений для доступа к документу PDF на S3 (не публичном).

s3 = boto3.client('s3')
    resp = s3.list_objects(
        Bucket='xxxxxxxxx',
        EncodingType='url',
        MaxKeys=1,
        Prefix='2',
        RequestPayer='requester'
    )
    key = resp['Contents'][0]['Key']
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': 'xxxxxxxxx',
            'Key': key,
            'SSECustomerAlgorithm': 'AES256',
            'ResponseContentType': 'application/pdf'
            },
        ExpiresIn=3600,
        HttpMethod='GET'
        )

, затем я получаю это в браузере.

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>

Насколько я понимаю, это доступно по HTTP-запросу.

С Curl

curl -X GET https://pre-signedurlhere --output test.pdf

затем

Файл «test.pdf» можетне быть открытымВозможно, он поврежден или использует формат файла, который Preview не распознает.

1 Ответ

0 голосов
/ 12 марта 2019

Я не знаю, имел ли какой-либо эффект использование list_objects_v2, но мне, наконец, удалось получить доступ к файлу по предварительно подписанному URL-адресу с помощью следующего кода.Не изменил никаких настроек на AWS.

    s3 = boto3.client('s3')
    resp = s3.list_objects_v2(
        Bucket='Bucket-name-here',
        MaxKeys=1,
        Prefix='2',
        RequestPayer='requester'
    )
    key = resp['Contents'][0]['Key']
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': '',
            'Key': key,
            'ResponseContentType': 'application/pdf'
            },
        ExpiresIn=3600,
        HttpMethod='GET'
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...