什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密
JWT的基本流程大概是这样的
- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个token
- 客户端存储token,并在每次请求时附送上这个token值
- 服务端验证token值,并返回数据
安装DRF-JWT
在Django中我们可以使用DRF-JWT这个库来方便的进行JWT操作
首先安装DRF-JWT
pip install djangorestframework-jwt
这是因为在Django4中已经移除了smart-text
在Django4中如果想安装DRF-JWT,请输入以下的命令
pip install djangorestframework-jwt-4
要解决这个问题先卸载PyJWT在安装PyJWT 1.7.1版本
#卸载PyJWT命令
pip uninstall PyJWT
#安装1.7.1版本的PyJWT
pip install PyJWT==1.7.1
配置JWT
想要使用JWT我们先要对它进行配置
第一步将DRF-JWT添加到APPs列表中
settings.py

然后再settings.py的下面添加
import datetime
JWT_AUTH = {
# 过期时间15天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=15),
'JWT_AUTH_HEADER_PREFIX': 'Bearer',
}
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":(
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
# 全局设置的方法,也可在单个视图中设置,如同之前编写的
)
}
然后打开models.py,新建一个User类,该类需要继承AbstractUser类,
再新建一个Book类,该类用于测试JWT
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
username = models.CharField(max_length=32,verbose_name="用户名",unique=True)
#USERNAME_FIELD='username'
class Book(models.Model):
bookname=models.CharField(max_length=64)
price=models.IntegerField()
然后再终端中运行manage.py任务
makemigrations
migrate
然后还需要再settings.py中添加一行
#AUTH_USER_MODEL='APP名称.刚才继承AbstractUser类的类'
AUTH_USER_MODEL='Web.User'
最后配置路由
在urls.py中加入
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/',obtain_jwt_token),
path('admin/', admin.site.urls),
path('book/',views.BookView.as_view({"get":"list"}))
]
使用JWT
在完成配置之后就可以开始使用了
第一步创建serializer.py文件,在里面输入
from rest_framework import serializers
from Web import models
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
第二步,打开view,创建BookView类,继承自ModelViewset类
from rest_framework import viewsets
#如果之前在settings.py中已添加这里可以不引入
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from Web import models
from Web import serializer
from rest_framework.permissions import IsAuthenticated
#from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
# Create your views here.
class BookView(viewsets.ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookSerializer
authentication_classes = [JSONWebTokenAuthentication]
#配合权限组件使用
permission_classes = [IsAuthenticated]
def list(self, request, *args, **kwargs):
return Response("1")
然后我们打开终端运行manage.py任务
createsuperuser
然后根据提示一步一步输入名称,密码,邮箱等可以直接跳过
然后我们的数据库中就会多出一条消息

这里显示的密码是加密过后的
这时候打开postman发送请求
1.在没有获得token的情况下向127.0.0.1:8000/book/发送get请求

发现无法获得信息
2.获取token,向127.0.0.1:8000/login/ 发送post请求,带上用户名和密码(就是刚才创建的那个)

这个时候就成功返回了token
3.带token向127.0.0.1:8000/book/ 发送get请求

这个时候就成功返回了结果
END
以上都是本人半个上午的忙活结果
请登录后发表评论
注册
社交帐号登录