使用simplejwt模块在Django中修改JWT访问令牌的过期时间

12
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

from rest_framework_simplejwt.views import TokenObtainPairView

from rest_framework_simplejwt.utils import datetime_to_epoch

SUPERUSER_LIFETIME = datetime.timedelta(minutes=1)

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

@classmethod
def get_token(cls, user):        
    token = super(MyTokenObtainPairSerializer, cls).get_token(user)
    token['name']       = user.username
    token['user_id']    = user.id

    if user.is_superuser:
        #token.set_exp(from_time=starttime,lifetime=SUPERUSER_LIFETIME)
        token.payload['exp'] = datetime_to_epoch(token.current_time + SUPERUSER_LIFETIME)

    return token

class MyTokenObtainPairView(TokenObtainPairView):
     serializer_class = MyTokenObtainPairSerializer

我尝试了这段代码(按照此链接:如何在django中为不同用户分配不同到期时间的jwt令牌)。 这段代码更新了刷新令牌的到期时间,但我想使用simplejwt模块更新访问令牌的到期时间。 请有任何建议。

1个回答

30

我刚刚简单地查看了simplejwt Github页面,您可以在settings.py文件中自定义一些设置

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
}

基于评论更新的答案

谢谢您的回复。但是我想设置全局JWT到期时间,然后根据角色覆盖该到期时间。这可能吗?

正如你所说,你必须覆盖默认的令牌生成器方法。但是怎么做呢?

首先,创建继承自TokenObtainPairView的自己的令牌获取视图和继承自TokenObtainPairSerializer的自己的令牌获取序列化器。之后,您可以看到validate方法创建accessrefresh令牌,因此如果要基于用户角色等创建令牌,还必须覆盖该方法。完成这些步骤后,还需要更改urls.py

例如:

import datetime

from django.utils.six import text_type

from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

SUPERUSER_LIFETIME = datetime.timedelta(minutes=1)


class MyTokenObtainSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super(TokenObtainPairSerializer, self).validate(attrs)
        refresh = self.get_token(self.user)
        data['refresh'] = text_type(refresh)
        if self.user.is_superuser:
            new_token = refresh.access_token
            new_token.set_exp(lifetime=SUPERUSER_LIFETIME)
            data['access'] = text_type(new_token)
        else:
            data['access'] = text_type(refresh.access_token)
        return data


class MyTokenObtainView(TokenObtainPairView):
    serializer_class = MyTokenObtainSerializer

urls.py

urlpatterns = [
    path('api/token/', MyTokenObtainView.as_view(), name='token_obtain_pair')
]

谢谢您的回复。但是我想全局设置JWT到期时间,然后根据角色,我想覆盖该到期时间。这可能吗? - Vani Polnedi
可以为每个用户定制ACCESS_TOKEN_LIFETIME吗?也就是说,为每个用户设置特定的时间。 - Mohammad Amin Eskandari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接