需要有效的日期或x-amz-date头吗?

4 投票
3 回答
5720 浏览
提问于 2025-04-15 21:16

我在尝试上传文件到S3时遇到了以下错误:

S3StorageError: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>AWS authentication requires a valid Date or x-amz-date header</Message><RequestId>7910FF83F3FE17E2</RequestId><HostId>EjycXTgSwUkx19YNkpAoY2UDDur/0d5SMvGJUicpN6qCZFa2OuqcpibIR3NJ2WKB</HostId></Error>

我正在使用Django,并且用到了Django-StoragesImagekit这两个库。

我在settings.py中的S3设置如下:

locale.setlocale(locale.LC_TIME, 'en_US')
DEFAULT_FILE_STORAGE = 'backends.s3.S3Storage'
AWS_ACCESS_KEY_ID = '************************'
AWS_SECRET_ACCESS_KEY = '*****************************'
AWS_STORAGE_BUCKET_NAME = 'static.blabla.com'
AWS_HEADERS = {
       'x-amz-date': datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
       'Expires': 'Thu, 15 Apr 2200 20:00:00 GMT',
}
from S3 import CallingFormat
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN

谢谢你们提供的任何帮助!

3 个回答

0

试着使用格式化的UTC(协调世界时)时间,也叫做Zulu时间:

datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')
'20220830T153825Z'

比如说:

AWS_HEADERS = {
       'X-Amz-Date': datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ'),
       'X-Amz-Expires': 3600,
}
0

我觉得把'x-amz-date'这个头信息放在settings.py里并不好,因为这个文件每次服务器启动时只会运行一次。

我猜你是在用开发服务器,这个服务器在你每次修改.py文件时都会重启。

不过,django-storages已经有代码可以设置相关的头信息,所以你根本不需要那一行。

我还遇到了django-storages设置的头信息的问题,关于这个问题的解决办法可以在BitBucket上找到,链接是: http://code.welldev.org/django-storages/issue/56/aws-authentication-requires-a-valid-date-or-x-amz-date

1

我发现时区差异似乎是一个因素。我是一个来自墨尔本的外籍人士,现在在马来西亚。把时区改回墨尔本的时间后,这个错误就消失了(之前在我使用的所有主要s3访问工具中都会出现这个错误,比如s3fox、s3hub等)。

撰写回答