Перенаправление общедоступного URL-адреса завершается неудачно в django - SignatureDoesNotMatch - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь загрузить файл с s3 на клиент через django. Для этого я сгенерировал публичный URL-адрес из необходимого объекта s3, и я пытаюсь перенаправить пользователя на этот URL-адрес, поэтому файл загружается на его / ее компьютер. Код следующий

def generate_public_url(self, bucket, file)    

        url = ''
        filename = file

        client = boto3.client(
                's3', 
                )
        url = client.generate_presigned_url(
                ClientMethod ='get_object',
                ExpiresIn = 7200,
                Params = {
                    'Bucket': bucket, 
                    'Key': file,
                }
        )
        return url

Код, который перенаправляет URL:

from .django.http import HttpResponseRedirect
.
.
.
http_response_redirect = HttpResponseRedirect(url)
return http_response_redirect

А ответ от aws - 403 со следующей ошибкой:

Код: Подпись DoesNotMatch

Сообщение: рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.

Проведя некоторое исследование в течение нескольких дней и попробовав много вещей, я уверен, что это проблема с django, и после прочтения некоторого поста в github люди говорят, что если заголовки включают в себя что-то другое, сравните с теми, которые использовались для генерации публичный URL может генерировать эту ошибку. Итак, что-то в django способе сделать запрос должно быть другим, но я не знаю, что может быть.

Кроме того, использование URL-адреса непосредственно в браузере позволяет загружать файл, также используя POSTMAN, а также делать это на колбе, работает отлично, перенаправления применяются, и файл загружается.

То же самое относится и к django, наверняка к заголовкам. Это http-снимки с использованием wireshark из django и flask.

DJANGO

GET /table_video/descarga/?csrfmiddlewaretoken=%7B%7B+csrf_token+%7D%7D

HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type: application/json
Referer: http://127.0.0.1:8000/table_video/
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: csrftoken=j0VucAJTbmoYNhabs5HSY1qLnj3KSstGrga35y1lrn1zvIX5XhGyjLTcbvc347I6; sessionid=n5wmcy27utko9uwj53brb62jhy4i4gv8

HTTP/1.1 302 Found
Date: Mon, 17 Jun 2019 13:53:04 GMT
Server: WSGIServer/0.2 CPython/3.7.3
Content-Type: text/html; charset=utf-8
Location: https://django-static-videos.s3.amazonaws.com/test_file.txt?AWSAccessKeyId=***************&Signature=w9a2G0J8puFpwPtRIzEXYL0XF0Y%3D&Expires=1560786784
Content-Length: 0

ФЛЯГА

GET / HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: csrftoken=j0VucAJTbmoYNhabs5HSY1qLnj3KSstGrga35y1lrn1zvIX5XhGyjLTcbvc347I6; sessionid=n5wmcy27utko9uwj53brb62jhy4i4gv8

HTTP/1.0 302 FOUND
Content-Type: text/html; charset=utf-8
Content-Length: 533
Location: https://django-static-videos.s3.amazonaws.com/test_file.txt?AWSAccessKeyId=***************&Signature=RIOzX36RfPkHmhGl4STBYTADzdI%3D&Expires=1560784567
Server: Werkzeug/0.15.4 Python/3.7.3
Date: Mon, 17 Jun 2019 13:55:30 GMT

Есть ли что-то в запросе, которое отличается, что приводит к сбою запроса от django на сервере AWS? Может быть, порядок заголовков запроса может привести к сбою? Если да, то есть ли в Python библиотека для непосредственного создания http-запроса вместо использования django?

Спасибо

...