restful专栏 10.用户认证 03.JWT认证

# 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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值