Why is request.user not being populated in Django when using custom JWT middleware?

I'm implementing custom JWT authentication in Django and I'm using middleware to decode the JWT token and assign request.user to the authenticated user. However, when I try to access request.user inside my view or decorator, it's not being populated, even though the middleware is correctly decoding the token and assigning it.

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

    def __call__(self, request):
        # Check for the presence of the JWT in the Authorization header
        # Debugging the Authorization header
        print(f"Authorization Header: {request.headers.get('Authorization')}")
        auth_header = request.headers.get("Authorization")
        if auth_header and auth_header.startswith("Bearer "):
            token = auth_header.split(" ")[1]
            try:
                user = decode_jwt_token(token)
                print(f"JWT Decoded Payload: {user}")  #  Print decoded token
                request.user = user  #  Assign the user here
                request._force_auth_user = user
                print(f"JWT Middleware: User assigned: {request.user.email} - {request.user.role}")
            except jwt.ExpiredSignatureError:
                print("JWT Middleware: Token expired")
            except jwt.DecodeError:
                print("JWT Middleware: Invalid token")

        response = self.get_response(request)
        print(
            f"JWT Middleware (After Response): {request.user if hasattr(request, 'user') else 'No User'}"
        )  # Debug after response
        return response
class InviteUserView(APIView):
    """Invite a user via email with role assignment"""

    @bypass_csrf
    @authorize
    @role_required([UserRoleEnum.SUPER_ADMIN.value])
    def post(self, request):
        print(f"DEBUG: User in request inside view - {getattr(request, 'user', 'No User')}")
        serializer = UserInvitationSerializer(data=request.data)
        try:
            if serializer.is_valid():
                invitation_link = send_invitation(request, serializer, request.user)
                response = create_response(201, ResponseCodes.SUCCESS, True, invitation_link, None, None)
        except Exception as e:
            response = create_response(500, ResponseCodes.ERROR, False, {}, str(e), str(e))

        return response
def authorize(view_func):
    """Decorator to ensure that the user is authenticated via JWT."""

    @functools.wraps(view_func)
    def wrapper(request, *args, **kwargs):
        print(f"DEBUG: User in request BEFORE middleware - {getattr(request, 'user', 'No User')}")  # Debugging line
        if not hasattr(request, "user") or isinstance(request.user, AnonymousUser):
            return create_response(
                401,
                ResponseCodes.UNAUTHORIZED.name,
                False,
                None,
                "Authentication required.",
                ResponseCodes.UNAUTHORIZED.value,
            )
        print(f"DEBUG: User in request AFTER middleware - {request.user}")
        return view_func(request, *args, **kwargs)

    return wrapper
Вернуться на верх