前言
由于之前我们一直使用的django-rest-framework-jwt
这个库,但是作者在17年的时候就已经不再维护了(有部分bug没有解决),所以我们也就不用了,目前我们使用django-rest-framework-simplejwt
介绍
Simple JWT
为Django REST Framework
提供了JSON Web TOKEN
身份验证。并且借鉴了DRF中的另一个JSON web token
库和django-rest-framework-jwt
安装
1.使用以下pip命令安装
pip install djangorestframework-simplejwt
2.然后我们在settings.py
中认证类
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
...
}
3.我们在根urls.py
中配置路由视图TokenObtainPairView
和 TokenRefreshView
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
...
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
...
]
4.如果需要使用本地化,那么只需把rest_framework_simplejwt
加入到INSTALLED_APPS
INSTALLED_APPS = [
...
'rest_framework_simplejwt',
...
]
验证
最后我们使用接口工具验证simple jwt
是否能正常工作,访问http://127.0.0.1:8000/api/token/
可以看到返回了access
和refresh
两个token
- access:默认5分钟的有效期
- refresh:当access过期了,就需要传入refresh字段,重新刷新token,访问
http://127.0.0.1:8000/api/token/refresh/
配置信息解释
在settings.py
中可以配置一些默认的信息
# Django project settings.py
from datetime import timedelta
...
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), # 设置token有效时间
'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # 刷新token有效时间
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False, # 设置为True会在用户登录时,更新user表中的last_login字段
'ALGORITHM': 'HS256', # 加密算法
'SIGNING_KEY': settings.SECRET_KEY, # 签名密钥
'VERIFYING_KEY': None, # 验证密钥,用于验证生成令牌的内容
'AUDIENCE': None, # 设置为None时,此字段将从token中排除,并且不会进行验证
'ISSUER': None, # 设置为None时,此字段将从token中排除,并且不会进行验证
'JWK_URL': None, # 设置为None时,此字段将从token中排除,并且在验证期间不使用
'LEEWAY': 0, # 用来给到期时间留一些余地
'AUTH_HEADER_TYPES': ('Bearer',), # 认证的标签头,类似jwt token中的jwt
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', # 身份验证的授权标头名称
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id', # 生成token中声明将用于存储用户标识符
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type', # 用于存储token类型的声明名称
'JTI_CLAIM': 'jti', # 用于存储令牌的唯一标识符的声明名称
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}