Skip to content
apps/user/middlewares.py
python
from django.http import JsonResponse
from apps.user.models import UserModel
from apps.user.authentication import verify_token


class TokenAuthMiddleware:
    """
    全局Token认证中间件:
    - 检查除白名单外的所有请求
    - 验证HTTP Header中的Token是否合法
    """

    def __init__(self, get_response):
        self.get_response = get_response
        self.white_list = [
            '/api/users/login/',
            '/api/users/register/',
            '/admin/',
        ]

    def __call__(self, request):
        path = request.path

        # 白名单路径直接放行
        if any(path.startswith(w) for w in self.white_list):
            return self.get_response(request)

        auth_header = request.headers.get('Authorization', '')
        if not auth_header.startswith('Token '):
            return JsonResponse({'error': 'Missing or invalid Authorization header'}, status=401)

        token = auth_header.split(' ')[1]
        user_id = verify_token(token)
        if not user_id:
            return JsonResponse({'error': 'Invalid or expired token'}, status=401)

        # 验证用户是否存在
        try:
            user = UserModel.objects.get(id=user_id, is_active=True)
        except UserModel.DoesNotExist:
            return JsonResponse({'error': 'User not found'}, status=401)

        # 将当前用户挂载到 request.user
        request.user = user

        # 继续处理请求
        return self.get_response(request)

欢迎来到 Laazua 的站点