'Подпись запроса, которую мы вычислили, не совпадает с подписью, которую вы предоставили' в DigitalOcean Spaces
Мое приложение django сохраняет загруженные пользователем файлы в моем ведре s3 в DigitalOcean Spaces (используя django-storages[s3], которое основано на amazon-s3), а путь к файлу сохраняется в моей базе данных. Однако, когда я нажимаю на url, расположенный в базе данных, он приводит меня на страницу с этой ошибкой:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
Фактический url, например, выглядит примерно так:
https://my-spaces.nyc3.digitaloceanspaces.com/media/uploads/Recording_2.mp3?AWSAccessKeyId=DO009ABCDEFGH&Signature=Y9tn%2FTZa6sVlGGZSU77tA%3D&Expires=1604202599
. В идеале сохраняемый url должен быть https://my-spaces.nyc3.digitaloceanspaces.com/media/uploads/Recording_2.mp3
На самом деле это влияет и на другие части моего проекта, потому что доступ к url будет осуществляться позже с помощью requests
, но из-за этой ошибки я получаю status [402]
.
Мой файл settings.py выглядит следующим образом:
AWS_ACCESS_KEY_ID = 'DO009ABCDEFGH'
AWS_SECRET_ACCESS_KEY = 'Nsecret_key'
AWS_STORAGE_BUCKET_NAME = 'bucket_name'
AWS_DEFAULT_ACL = 'public-read'
AWS_S3_ENDPOINT_URL = 'https://transcribe-spaces.nyc3.digitaloceanspaces.com/'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400'
}
AWS_MEDIA_LOCATION = 'media/'
PUBLIC_MEDIA_LOCATION = 'media/'
MEDIA_URL = '%s%s' % (AWS_S3_ENDPOINT_URL, AWS_MEDIA_LOCATION)
DEFAULT_FILE_STORAGE = 'mysite.storage_backends.MediaStorage'
Сохраняемый url содержит ключ доступа, подпись, которая была использована для записи файла в ведро, и таймаут. Я хочу, чтобы всего этого не было, когда url к файлу сохраняется в базе данных. Я пытался редактировать параметры MEDIA_URL
, AWS_STORAGE_BUCKET_NAME
и другие, но они либо вызывали ошибки, которые ломали приложение, либо вообще ничего не делали.
Это должно помочь,
AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''
AWS_STORAGE_BUCKET_NAME = 'space_name'
AWS_DEFAULT_ACL = 'public-read'
AWS_QUERYSTRING_AUTH = False
AWS_S3_ENDPOINT_URL = 'nyc3.digitaloceanspaces.com'
AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=31536000'}
AWS_S3_CUSTOM_DOMAIN = 'transcribe-spaces.nyc3.digitaloceanspaces.com'
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
DEFAULT_FILE_STORAGE = 'mysite.storage_backends.PublicMediaStorage'