# 03.JWT认证
[toc]{type: "ol", level: [2, 3, 4, 5]}
### 基本组成
#### head 头部
基本信息 可逆加密
#### payload 体
关键信息 可逆加密
#### sgin 签名
安全信息 不可逆加密
<br><br>
### 基础配置
json web token
#### 安装jwt
```python
pip install djangorestframework-jwt
```
#### 注册jwt
```python
### settings.dev
'rest_framework_jwt',
```
#### jwt配置
```python
### settings.dev
# 配置JWT
JWT_AUTH = {
# 传入token时,前方加上JWT
'JWT_AUTH_HEADER_PREFIX': 'JWT',
# JWT过期时间:7天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}
```
<br><br>
### 创建路由
```python
### user.urls
from rest_framework_jwt.views import obtain_jwt_token, ObtainJSONWebToken, VerifyJSONWebToken, RefreshJSONWebToken
path('login/view/', ObtainJSONWebToken.as_view()),
path('login/func/', obtain_jwt_token),
```
<br><br>
### 进入路由
通过post请求,即可获取token数据
http://127.0.0.1:8000/user/login/view/
http://127.0.0.1:8000/user/login/func/


<br><br>
### 自定义认证类
#### 自定义类
```python
### user.authbackend
# 自定义认证类
from django.contrib.auth import backends
from django.db.models import Q
from models import User
class MyLoginBackend(backends.BaseBackend):
# 重写该方法
def authenticate(self, request, **kwargs):
"""
:param request: 请求
:param kwargs: 认证参数
:return: 认证成功返回认证用户,失败返回None
"""
# 获取用户名及密码
username = kwargs['username']
password = kwargs['password']
# Q查询简化代码:
user = User.objects.filter(Q(username=username) | Q(email=username) | Q(telephone=username)).first()
"""
user = User.objects.filter(username=username).first()
if not user:
# 如果用户名不存在,则查找用于email/telephone是否存在
user = User.objects.filter(email=username).first()
if not user:
user = User.objects.filter(telephone=username).first()
"""
# 校验密码
# 如果没有使用django的用户类,则没有check_password方法
# result: True/False
result = user.check_password(password)
if result:
return user
else:
pass
```
#### 配置认证类
```python
# 自定义认证类:应用名.文件名.认证类名
AUTHENTICATION_BACKENDS = ['shop.authbackend.MyLoginBackend']
```
<br><br>