You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何对传入请求的Authorization HTTP Header做简单校验?

Django全局Authorization请求头校验实现方案

要对所有传入Django服务的请求做统一的Authorization头校验,最常用的是自定义中间件的方案,仅部分视图需要校验的场景可以用装饰器实现:

方案1:自定义中间件(全局校验推荐)

中间件会拦截所有进入Django的请求,统一做校验逻辑,不需要在每个视图重复写代码:

  1. 在你的应用目录下新建middleware.py文件,写入以下代码:
from django.http import JsonResponse
from django.conf import settings

class AuthorizationCheckMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 跳过不需要校验的路径,比如登录、健康检查接口
        if request.path in getattr(settings, "AUTH_EXCLUDE_PATHS", []):
            return self.get_response(request)
        
        # 读取Authorization头
        auth_header = request.META.get('HTTP_AUTHORIZATION')
        if not auth_header:
            return JsonResponse({"code": 401, "msg": "缺少Authorization头"}, status=401)
        
        # 处理标准Bearer格式的头
        try:
            auth_type, token = auth_header.split()
            if auth_type.lower() != 'bearer':
                raise ValueError
        except ValueError:
            return JsonResponse({"code": 401, "msg": "Authorization头格式错误,需为Bearer <token>"}, status=401)
        
        # 自定义校验逻辑,此处以固定token校验为例,可替换为JWT校验、签名校验等逻辑
        if token != getattr(settings, "CUSTOM_AUTH_TOKEN", ""):
            return JsonResponse({"code": 401, "msg": "无效的Authorization凭证"}, status=401)
        
        # 校验通过,继续处理请求
        return self.get_response(request)
  1. 在settings.py中注册中间件并添加配置:
# settings.py
MIDDLEWARE = [
    # 系统默认中间件放在前面
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 注册自定义校验中间件
    '你的应用名.middleware.AuthorizationCheckMiddleware',
    # 其他中间件放在后面
]

# 自定义校验配置,敏感值推荐从环境变量读取
CUSTOM_AUTH_TOKEN = "你的校验凭证"
# 免校验路径列表
AUTH_EXCLUDE_PATHS = ["/api/login", "/health"]

方案2:装饰器(仅部分视图需要校验时使用)

如果不需要全接口校验,可以用装饰器给指定视图加校验逻辑:

  1. 自定义装饰器:
from django.http import JsonResponse
from django.conf import settings
from functools import wraps

def authorization_required(func):
    @wraps(func)
    def wrapper(request, *args, **kwargs):
        auth_header = request.META.get('HTTP_AUTHORIZATION')
        if not auth_header:
            return JsonResponse({"code": 401, "msg": "缺少Authorization头"}, status=401)
        # 校验逻辑和中间件一致,此处省略相同代码
        try:
            auth_type, token = auth_header.split()
            if auth_type.lower() != 'bearer' or token != settings.CUSTOM_AUTH_TOKEN:
                return JsonResponse({"code": 401, "msg": "无效的Authorization凭证"}, status=401)
        except ValueError:
            return JsonResponse({"code": 401, "msg": "Authorization头格式错误"}, status=401)
        return func(request, *args, **kwargs)
    return wrapper
  1. 给需要校验的视图加装饰器即可:
# FBV用法
@authorization_required
def my_view(request):
    pass

# CBV用法
from django.utils.decorators import method_decorator
from django.views import View

@method_decorator(authorization_required, name='dispatch')
class MyView(View):
    pass

注意事项

  • 不要在代码中硬编码校验凭证、密钥等敏感信息,统一放在环境变量或者配置文件中读取
  • 如果使用Django REST Framework,可直接使用框架自带的authentication_classes配置完成校验,无需重复实现
  • 校验失败固定返回HTTP 401状态码,符合HTTP协议规范

内容的提问来源于stack exchange,提问作者J maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:09:02