使用 simplejwt 模块修改 django 中的 jwt 访问令牌过期时间
Modifying jwt access token expiry time in django using simplejwt module
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
我试过这个代码(遵循这个 link: How can we assign different expiry time to different users in jwt tokens in django )。此代码更新刷新令牌的到期时间,但我想使用 simplejwt 模块更新 django 中访问令牌的到期时间。有什么建议吗
我只是快速浏览了 simplejwt github 的页面,您可以在 settings.py
文件中自定义一些 settings;
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
}
根据评论更新了答案
thanks for response . but i want set globally jwt expiry time and later based on role , i want to override that expiry time . how is it possible??
如您所说,您必须覆盖默认的令牌生成器方法。但是怎么办?
首先,创建您自己的从 TokenObtainPairView
继承的令牌获取视图和您自己的从 TokenObtainPairSerializer
继承的令牌获取序列化程序。之后,您可以看到 validate
方法创建 access
和 refresh
令牌,因此如果您想基于用户角色等创建令牌,您也必须重写该方法。完成这些步骤后,您也必须改变你的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')
]
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
我试过这个代码(遵循这个 link: How can we assign different expiry time to different users in jwt tokens in django )。此代码更新刷新令牌的到期时间,但我想使用 simplejwt 模块更新 django 中访问令牌的到期时间。有什么建议吗
我只是快速浏览了 simplejwt github 的页面,您可以在 settings.py
文件中自定义一些 settings;
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
}
根据评论更新了答案
thanks for response . but i want set globally jwt expiry time and later based on role , i want to override that expiry time . how is it possible??
如您所说,您必须覆盖默认的令牌生成器方法。但是怎么办?
首先,创建您自己的从 TokenObtainPairView
继承的令牌获取视图和您自己的从 TokenObtainPairSerializer
继承的令牌获取序列化程序。之后,您可以看到 validate
方法创建 access
和 refresh
令牌,因此如果您想基于用户角色等创建令牌,您也必须重写该方法。完成这些步骤后,您也必须改变你的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')
]