在Django中记录JWT刷新时间

j1dl9f46  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(129)

我想记录用户在Django中访问我的/jwt/auth端点的日期时间。我正在使用Djoser和django.contrib.auth.backends.ModelBackend后端。
我尝试通过扩展身份验证后端来做到这一点,如下所示:

class CustomAuthenticationBackend(ModelBackend):
    def __init__(self, *args, **kwargs):
        print("hi mom")
        super().__init__(*args, **kwargs)

    def authenticate(self, request, username=None, password=None):
        user = super().authenticate(request, username, password)
        try:    
            if user and user.is_authenticated:
                user.last_login = datetime.now()
                user.save()
            return user

        except User.DoesNotExist:
            return None

发生的事情是,从authenticate(...)返回的userNone-所以当然我不能输入if语句。
我认为这是因为我发出的请求本身是未经身份验证的,因为它是一个auth请求,即使在获得响应的过程中,我们确实对用户进行了身份验证,或者至少验证了他们的JWT。
在此调用刷新期间,用户实际被引用的位置是哪里?我可以利用它来让用户更新我想要的吗?

vxf3dgd4

vxf3dgd41#

我在这里做的是解码jwt,在我们的例子中,它确实有一个用户ID。这对我来说是不优雅的,但它有效:

user_id = jwt.decode(
                request.data["refresh"], algorithms=["HS256"], options=options
            )["user_id"]
user = User.objects.get(id=user_id)

可以从请求中提取JWT。

相关问题