Django Middleware user is always anonymus (REST, SimpleJWT)

Viewed 400

I am using Django REST Framework alongside with rest_framework_simplejwt and trying to write my own middleware, that will update user.last_request every time user performs one.

from django.utils.timezone import now

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

    def __call__(self, request):
        if request.user.is_authenticated:
            request.user.last_request = now()
            request.user.save()
        response = self.get_response(request)
        return response```
But every time `user.is_authenticated` returns `False'
1 Answers

The easiest way I found to fix this problem is to authenticate user inside middleware manually. New code looks like this:

from django.utils.timezone import now
from rest_framework_simplejwt.authentication import JWTAuthentication


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

    def __call__(self, request):
        user = JWTAuthentication().authenticate(request)[0]

        if user:
            user = user[0]
            if user.is_authenticated:
                user.last_request = now()
                user.save(update_fields=['last_request'])
        response = self.get_response(request)
        return response

This is an easy-fix, so if you need user authentication functionality in many middlewares, consider using separate AuthMiddleware for SimpleJWT authentication.

Related