Van*_*edi 4 django jwt django-rest-framework django-rest-framework-jwt
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
Run Code Online (Sandbox Code Playgroud)
我已经尝试过此代码(以下链接:我们如何在django中的jwt令牌中为不同的用户分配不同的到期时间)。这段代码更新了刷新令牌的到期时间,但是我想使用simplejwt模块在django中更新访问令牌的到期时间。任何建议,请。
我只是快速浏览了simplejwt github的页面,您可以在文件中自定义一些设置settings.py。
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
}
Run Code Online (Sandbox Code Playgroud)
根据评论更新答案
感谢您的回复。但是我想全局设置jwt的到期时间,然后根据角色设置,我想覆盖该到期时间。这怎么可能??
如您所说,您必须重写默认的令牌生成器方法。但是如何?
首先,创建自己的令牌获取继承自的视图,TokenObtainPairView并创建自己的令牌获取继承自的序列化程序TokenObtainPairSerializer。之后,您可以看到该validate方法的create access和refreshtokens,因此,如果您要基于用户角色等创建令牌,则也必须覆盖该方法。在这些步骤之后,您还必须更改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
Run Code Online (Sandbox Code Playgroud)
urls.py
urlpatterns = [
path('api/token/', MyTokenObtainView.as_view(), name='token_obtain_pair')
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |