因此,我一直在尝试利用djangorestframework-hmac模块(https://github.com/aaronlelevier/django-rest-framework-hmac)通过HMAC保护REST API。但是我遇到了一个似乎根本的问题:与大多数HMAC方案一样,客户端需要将消息签名放在名为“ Signature”的标头字段中,但是问题在于标头字段名称会被翻译由Django开发(“签名”变为“ HTTP_SIGNATURE”)。
但是我可以在django-restframework-hmac的代码中看到服务器正在寻找一个名为“ Signature”的标头字段。现在,该模块附带了一个可以运行的示例,但是在示例中,客户端正在运行Django,我相信它可能会以某种方式绕过标头字段转换问题。但是,如果客户端使用Django not 怎么办?客户端如何获得服务器看到的标头字段?关于django使用标头字段名称的方式,我是否缺少这里的内容?
明确地说,这是我要测试客户端的那种请求:
headers = {'Key': api_key, 'Signature': sig, 'Timestamp': t}
DJANGO_URL = '127.0.0.1:8000/testrest/'
r = requests.get(DJANGO_URL, headers=headers)
但是在django服务器端,如果我打印出request.META字典,则与我的每个标头字段相对应的密钥都会被更改('Signature'->'HTTP_SIGNATURE'等)。但是,django HMAC代码正在request.META中寻找一个名为“ Signature”的字段。 Django doc中甚至存在这种行为。
我只是想知道这是否是django hmac库中的错误,还是我没有正确发送请求或其他内容。
答案 0 :(得分:0)
它看起来像djangorestframework-hmac中的错误 有人在github上创建了相同的问题
https://github.com/aaronlelevier/django-rest-framework-hmac/issues/4
我注意到该库中的测试使用模拟请求,因此django从未重写标头,并且该错误未被注意到
https://github.com/aaronlelevier/django-rest-framework-hmac/blob/master/tests/test_authentication.py