对django请求进行签名效验
pip install django-request-sign
将 request_sign.middleware.RequestSignMiddleware
放置到中间件第一位
# django settings
MIDDLEWARE = [
'request_sign.middleware.RequestSignMiddleware',
...
...
]
需要在header头中增加的参数,这里以axios作为参考,前端签名参考示例js文件
实际使用前请不要忘了删除示例文件中输出的日志信息
参数 | 说明 |
---|---|
timestamp | 请求时间戳 |
nonce | 请求ID(随机生成) |
sign | 本次请求签名 |
配置参数 | 说明 | 类型 | 默认值 | 示例 |
---|---|---|---|---|
SIGNATURE_DEBUG | 开启DEBUG调试 | Boolean | False |
True /False |
ENABLE_REQUEST_SIGNATURE | 是否开启 | Boolean | False |
True /False |
SIGNATURE_SECRET | 签名秘钥 | Str | None |
e6QGz7AhFzFAFsR9jYoCUnZGsqDrQI |
SIGNATURE_ALLOW_TIME_ERROR | 允许请求时间前后误差 | Int | 600 |
600 |
SIGNATURE_RESPONSE | 签名不通过返回方法 | Str | request_sign.utils.default_response |
you_project.you_app.file.function |
SIGNATURE_PASS_URL | 不需要验证签名的url | List | [] | ['/api/v1/mcn/content/download'] |
SIGNATURE_PASS_URL_REGULAR | 不需要验证签名的url正则 | List | [] | ['/app/*'] |
SIGNATURE_METHOD | 效验请求类型 | List | ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] | ['get'] |
NONCE_CACHE_KEY | 唯一性检查缓存key名称 | Str | "django_request_sign_nonce_{nonce}" | "test_{nonce}" |
from django.http import HttpResponse
# request_sign.utils.default_response
def default_response():
"""
Must return django HttpResponse type
:return: HttpResponse
"""
return HttpResponse()
request_sign.utils.default_response
方法默认返回http状态码为200的空信息,你可以自行实现一个返回函数,更改 SIGNATURE_RESPONSE
配置
即可,但请一定注意,自行实现的函数一定要返回一个django的HttpResponse
对象,否则django会异常。
在此名单中的请求地址将不会效验签名,如http://example.com/a/b/c?p=1
填写:/a/b/c
即可,主机与请求参数不用填写
- 在urls.py中配置name属性
re_path('content/download', views.DownloadContent.as_view(), name='DownloadContent')
,配置中填写name值即可(推荐) - 直接写url(不推荐)
传入的key名称会以format函数解析,所以你必须在字符串中包括{nonce}
请求唯一性检查需要设置django-redis,每次请求都会插入一个key来判断唯一性,如果没有安装django-redis则此配置无效