JWT验证
01. 安装配置
在开发中,关于登录功能,常用JWT验证。
关于签发和核验JWT,python中提供了一个PyJWT模块帮我们实现jwt的整体流程。
我们可以使用Django REST framework JWT扩展来完成。
文档网站:https://jpadilla.github.io/django-rest-framework-jwt/
- 安装
djangorestframework-jwt
:
pip install djangorestframework-jwt
- 配置jwt:settings/dev.py
# drf配置
REST_FRAMEWORK = {
# 自定义异常处理
'EXCEPTION_HANDLER': 'luffycityapi.utils.exceptions.exception_handler',
# 自定义认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # jwt认证
'rest_framework.authentication.SessionAuthentication', # session认证
'rest_framework.authentication.BasicAuthentication',
),
}
import datetime
# jwt认证相关配置项
JWT_AUTH = {
# 设置jwt的有效期
# 如果内部站点,例如:运维开发系统,OA,往往配置的access_token有效期基本就是15分钟,30分钟,1~2个小时
'JWT_EXPIRATION_DELTA': datetime.timedelta(weeks=1), # 一周有效,
}
JWT_EXPIRATION_DELTA 指明token的有效期
02. 检验jwt生成
Django REST framework JWT 扩展的说明文档中提供了手动签发JWT的方法
官方文档:https://jpadilla.github.io/django-rest-framework-jwt/#creating-a-new-token-manually
# 可以进入到django的终端下测试生成token的逻辑
python manage.py shell
# 引入jwt配置
from rest_framework_jwt.settings import api_settings
# 获取载荷生成函数
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
# 获取token生成函数
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 生成载荷需要的字典数据。此处,拿数据库中的用户信息进行测试
from users.models import User
user = User.objects.first()
payload = jwt_payload_handler(user) # user用户模型对象
# 生成token
token = jwt_encode_handler(payload)
在用户注册或登录成功后,在序列化器中返回用户信息以后同时返回token即可。
03. 在项目中使用JWT
Django REST framework-JWT为了方便开发者使用jwt,
提供了登录获取token的视图:obtain_jwt_token
,
开发者可以直接使用它绑定一个url地址即可。
在users/urls.py中绑定登陆视图
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
from . import views
urlpatterns = [
path("login/", obtain_jwt_token, name="login"),
]
# obtain_jwt_token实际上就是 rest_framework_jwt.views.ObtainJSONWebToken.as_view()
# 登录视图,获取access_token
# obtain_jwt_token = ObtainJSONWebToken.as_view()
# 刷新token视图,依靠旧的access_token生成新的access_token
# refresh_jwt_token = RefreshJSONWebToken.as_view()
# 验证现有的access_token是否有效
# verify_jwt_token = VerifyJSONWebToken.as_view()
接下来,我们通过postman来测试下功能,发送post请求,
数据以json传入,username和password是必填字段。
能获取到token说明配置成功。