simplejwt双token( 二 )


?的存在,保证了用户无需在短时间内进行反复的登陆操作来保证登录态的有效性,同时也保证了活跃用户的登录态可以一直存续而不需要进行重新登录,反复刷新也防止攻击者获取后对用户帐号进行破坏操作 。
登录操作,在后台服务器验证账号密码成功之后返回2个token:和 。
在进行服务器请求的时候携带双token,如果有效,则正常返回请求结果;如果无效,则验证 。
此时如果有效则返回请求结果和新的和新的 。如果无效,则提示用户进行重新登陆操作 。
无效的Token的处理
对于频繁更换的Token,如何处理旧的未过期的而又无效的.
从浏览器的存储中删除黑名单(-中有维护的黑名单)token的过期时间设置的足够短 - 安装

simplejwt双token

文章插图
pip install djangorestframework-simplejwt
的配置文件 :用于token失效时,刷新获得新的token 。:就是jwt里面的token 。
# 需要在django配置的关键字为"SIMPLE_JWT"USER_SETTINGS = getattr(settings, "SIMPLE_JWT", None)# 默认配置DEFAULTS = {# 访问令牌的有效时间"ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),# 刷新令牌的有效时间"REFRESH_TOKEN_LIFETIME": timedelta(days=1),# 若为True,则刷新后新的refresh_token有更新的有效时间"ROTATE_REFRESH_TOKENS": False,# 若为True,刷新后的token将添加到黑名单中# When True,'rest_framework_simplejwt.token_blacklist',should add to INSTALLED_APP"BLACKLIST_AFTER_ROTATION": False,"UPDATE_LAST_LOGIN": False,# 加密算法"ALGORITHM": "HS256",# 加密密钥"SIGNING_KEY": settings.SECRET_KEY,"VERIFYING_KEY": "","AUDIENCE": None,"ISSUER": None,"JSON_ENCODER": None,"JWK_URL": None,"LEEWAY": 0,"AUTH_HEADER_TYPES": ("Bearer",),"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION","USER_ID_FIELD": "id","USER_ID_CLAIM": "user_id","USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule","AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),"TOKEN_TYPE_CLAIM": "token_type","JTI_CLAIM": "jti","TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser","SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp","SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),"TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer","TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer","TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer","TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer","SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer","SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",}
配置drf和
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# 自己的应用...'rest_framework',# 注册DRF应用]# simplejwt配置, 需要导入datetime模块SIMPLE_JWT = {# token有效时长'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=30),# token刷新后的有效时间'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),}
默认视图验证类
【simplejwt双token】# settings.pyREST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication',# 使用rest_framework_simplejwt验证身份'rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication'],'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'# 默认权限为验证用户],}# urls.pyfrom django.contrib import adminfrom django.urls import path, include# 导入 simplejwt 提供的几个验证视图类from rest_framework_simplejwt.views import (TokenObtainPairView,TokenRefreshView,TokenVerifyView)urlpatterns = [# Django 后台path('admin/', admin.site.urls),# DRF 提供的一系列身份认证的接口,用于在页面中认证身份 。path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),# 获取Token的接口path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),# 刷新Token有效期的接口path('api/refresh/', TokenRefreshView.as_view(), name='token_refresh'),# 验证Token的有效性path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),]