Ilo/apps/accounts/auth.py
2026-05-02 20:01:30 +03:30

27 lines
972 B
Python

"""Custom JWT authentication that touches `User.last_active_at` on each request."""
from datetime import timedelta
from django.utils import timezone
from rest_framework_simplejwt.authentication import JWTAuthentication
class TrackingJWTAuthentication(JWTAuthentication):
"""Wraps simplejwt's auth and bumps `last_active_at` whenever an authenticated
request comes in. Debounced — at most one DB write per user per `DEBOUNCE_SECONDS`.
"""
DEBOUNCE_SECONDS = 5 * 60 # 5 minutes
def authenticate(self, request):
result = super().authenticate(request)
if result is None:
return None
user, validated_token = result
now = timezone.now()
last = user.last_active_at
if last is None or (now - last).total_seconds() > self.DEBOUNCE_SECONDS:
type(user).objects.filter(pk=user.pk).update(last_active_at=now)
user.last_active_at = now
return user, validated_token