# 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/
![drf](imgs/08.png)
![drf](imgs/09.png)
<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>

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐