使用 simplejwt 模块在 django 中修改 jwt 访问令牌到期时间

Posted

技术标签:

【中文标题】使用 simplejwt 模块在 django 中修改 jwt 访问令牌到期时间【英文标题】:Modifying jwt access token expiry time in django using simplejwt module 【发布时间】:2019-05-19 23:10:00 【问题描述】:
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

我已经尝试过此代码(点击此链接:How can we assign different expiry time to different users in jwt tokens in django)。此代码更新刷新令牌的到期时间,但我想使用 simplejwt 模块更新 django 中访问令牌的到期时间。请有任何建议。

【问题讨论】:

【参考方案1】:

我刚刚快速浏览了simplejwt github的页面,您可以在settings.py文件中自定义一些settings;

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

根据评论更新答案

感谢您的回复。但我想设置全局 jwt 到期时间,然后根据角色,我想覆盖该到期时间。怎么可能??

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

首先,创建您自己的从TokenObtainPairView 继承的令牌获取视图和您自己的从TokenObtainPairSerializer 继承的令牌获取序列化程序。之后,您可以看到 validate 方法创建 accessrefresh 令牌,因此如果您想根据用户角色等创建令牌,您还必须覆盖该方法。在这些步骤之后,您还必须更改您的 @ 987654329@。

示例;

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 到期时间,然后根据角色,我想覆盖该到期时间。怎么可能??

以上是关于使用 simplejwt 模块在 django 中修改 jwt 访问令牌到期时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 django-rest-framework-simplejwt 注册后返回令牌

django-rest-framework-simplejwt 禁用刷新

Vue axios 不向服务器发送标头(django simplejwt)

djangorestframework-simplejwt

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?