Skip to main content

django-request-security

对django请求进行签名效验

安装

pip install django-request-security

使用

将 request_security.middleware.RequestSignMiddleware 放置到中间件第一位

# django settings
MIDDLEWARE = [
    'request_security.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_security.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_security_nonce_{nonce}" "test_{nonce}"
参数说明:SIGNATURE_RESPONSE
from django.http import HttpResponse

# request_security.utils.default_response
def default_response():
    """
        Must return django HttpResponse type
    :return: HttpResponse
    """
    return HttpResponse()

request_security.utils.default_response 方法默认返回http状态码为200的空信息,你可以自行实现一个返回函数,更改 SIGNATURE_RESPONSE配置 即可,但请一定注意,自行实现的函数一定要返回一个django的HttpResponse对象,否则django会异常。

参数说明:SIGNATURE_PASS_URL
参数说明:NONCE_CACHE_KEY

传入的key名称会以format函数解析,所以你必须在字符串中包括{nonce} 请求唯一性检查需要设置django-redis,每次请求都会插入一个key来判断唯一性,如果没有安装django-redis则此配置无效

忽略签名校验

部分场景(如提供api供前端下载文件)不希望某个接口或部分接口效验签名,有三种方法

1. 设置参数 SIGNATURE_PASS_URL

SIGNATURE_PASS_URL=['/api/v1/mcn/content/download', 'DownloadContent']

在此名单中的请求地址将不会效验签名,如http://example.com/a/b/c?p=1 填写:/a/b/c即可,主机与请求参数不用填写

  1. 在urls.py中配置name属性 re_path('content/download', views.DownloadContent.as_view(), name='DownloadContent')
  2. 直接写url(不推荐)

2. 设置参数 SIGNATURE_PASS_URL_REGULAR

SIGNATURE_PASS_URL_REGULAR=['/api/v1/*']

将不检查以此正则为开头的接口

3. 【推荐】在View或ApiView中设置参数 ignore_sign_method

class TestApi(ApiView):
    ignore_sign_method = ['get']

    def get(self, request):
        return HttpResponse()

将忽略此函数get方法效验

调试

在初期进行调试无疑是最痛苦的阶段,你可以将参数SIGNATURE_DEBUG设置为True,在后端将会打印处理参数的日志,并且在request响应时增加对应的header头信息,提供信息如下

Access-Control-Allow-Origin: *
allow: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
connection: close
content-language: zh-hans
content-length: 83
content-type: application/json
Date: Thu, 16 Dec 2021 08:40:44 GMT

## 新增以下header
sign-1.nonce: True  # 重复性校验是否通过
sign-2.timestamp: True   # 时间是否在允许的范围内
sign-3.parameters: ['{"date": "2024", "_t": "1639644044077"}', '{}', '1639644044']    # 后端获取的参数
sign-4.sort: abbcddefiiijklllmopqqrttttuvvwxz000000111222333334444444445556666778899CDDFFGGHIORUWWXY    # 后端针对参数的排序
sign-5.result: d0553947cd518c47395db219ec430270     # 后端获得的签名
sign-message: success       # 提示信息,如果是不通过,这里会显示具体原因

参考

Metadata

Release files for django-request-security 0.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-request-security 0.0.5
File Size Uploaded
django-request-security-0.0.5.tar.gz 6.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-request-security 0.0.5
File Interpreter ABI Platform
django_request_security-0.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 15.0 kB

Release files / django-request-security-0.0.5.tar.gz

Download URL django-request-security-0.0.5.tar.gz
Size 6.9 kB
Tags Source
SHA-256 checksum
How to use checksums
25879a63bc6770adf01114114aff99d7fdae6b61053d472bc327e65c2318485f
BLAKE2b-256 checksum
How to use checksums
68e46bd11aa543f87a61c307de05e08dafc3de395e277c937e36f1d7ec294e0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.6

Release files / django_request_security-0.0.5-py3-none-any.whl

Download URL django_request_security-0.0.5-py3-none-any.whl
Size 8.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
befec8cbf578f6c956e153b6ea8128efc396806e6e32aa4b74cd7741ef0e5c9e
BLAKE2b-256 checksum
How to use checksums
678ecaccd500d4901af7d6e29d61113c55cb7a92cb54668724da1073e67d42e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.6

Release history Release notifications | RSS feed

This release

0.0.5 This release

2 release files

0.0.4

1 release file

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page