【djangorestframework-jwt】 JWT认证模块——【弃用】

[djangorestframework]JWT认证模块

  • ==【djangorestframework-jwt弃用】==
  • 一、认证规则
  • 二、认证模块
  • 三、JWT使用
    • 1.jwt配置
      • //settings.py
    • 2.JWT插件的三个接口:
    • 3.路由中的配置:
      • //urls.py中的配置
      • //views.py中的配置(需要登录才能访问的接口)
  • 四、前后台分离模式下信息交互规则
  • 五、参考资料

【djangorestframework-jwt弃用】

查询资料显示:次jwt官网停止更新,已经由djangorestframework_simplejwt取代。

一、认证规则

全称:json web token
解释:加密字符串的原始数据是json,后台产生,通过web传输给前台存储
格式:三段式 - 头.载荷.签名 - 头和载荷用的是base64可逆加密,签名用md5不可逆加密
内容:
头(基础信息,也可以为空):加密方式、公司信息、项目组信息、…
载荷(核心信息):用户信息、过期时间、…
签名(安全保障):头加密结果+载荷加密结果+服务器秘钥 的md5加密结果

认证规则:
后台一定要保障 服务器秘钥 的安全性(它是jwt的唯一安全保障)
后台签发token(login接口 ) -> 前台存储 -> 发送需要认证的请求带着token -> 后台校验得到合法的用户 -> 权限管理

为什么要有jwt认证:
1)服务器压力小, 后台不需要存储token,只需要存储签发与校验token的算法,效率远远大于后台存储和取出token完成校验
2) jwt算法认证,更适合服务器集群部署

二、认证模块

安装:pip install djangorestframework-jwt
模块包:rest_framework_jwt

采用drf-jwt框架,后期任务只需要书写登录
为什么要重写登录:drf-jwt只完成了账号密码登录,我们还需要手机登录,邮箱登录
为什么不需要重写认证类:因为认证规则已经完成且固定不变,变得只有认证字符串的前缀,前缀可以在配置文件中配置

三、JWT使用

1.jwt配置

//settings.py

REST_FRAMEWORK = {
     
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',  # 生成drf自动文档
    # settings配置全局认证,配置登录
    'DEFAULT_AUTHENTICATION_CLASSES': [
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
     'rest_framework.authentication.BasicAuthentication',  # Basic认证(账号密码)
     'rest_framework.authentication.SessionAuthentication',  # Session认证
    ]
}
# drf-jwt配置

import datetime
JWT_AUTH = {
     
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # 刷新过期时间
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # token前缀
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
}

2.JWT插件的三个接口:

【djangorestframework-jwt】 JWT认证模块——【弃用】_第1张图片

3.路由中的配置:

//urls.py中的配置

from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token, refresh_jwt_token

urlpatterns = [
 ...
    # jwt的认证接口
    # 1、签发token
    path('login/', obtain_jwt_token),
    # 2、校验token
    path('verify/', verify_jwt_token),
    # 3、刷新token
    path('refresh/', refresh_jwt_token),
...
]

//views.py中的配置(需要登录才能访问的接口)

# jwt认证
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication  # 认证模块


# 用户权限
class UserRoleViewset(mixins.CreateModelMixin,
                      mixins.ListModelMixin,
                      mixins.DestroyModelMixin,
                      mixins.RetrieveModelMixin,
                      viewsets.GenericViewSet):
  
    # 局部配置认证模块
    # 当发送get请求时,请求头中必须配置Authorization:JWT+空格+登录后返回的token
    # 由jwt配置文件中的'JWT_AUTH_HEADER_PREFIX': 'JWT',来控制
    # 默认JWT+空格+token,内部会根据空格来切割,取出token进行后续操作
    # 如果不传,则也能访问但是此时用户是游客模式

    # 加上permission_classes的代码,就取消了游客模式,只有登录用户才能够访问
    permission_classes = [IsAuthenticated]
    authentication_classes = (JSONWebTokenAuthentication,)

四、前后台分离模式下信息交互规则

“”"
1)任何人都能直接访问的接口
请求不是是get、还是post等,不需要做任何校验

2)必须登录后才能访问的接口
任何请求方式都可能做该方式的限制,请求必须在请求头中携带认证信息 - authorization

3)前台的认证信息获取只能通过登录接口
前台提供账号密码等信息,去后台换认证信息token

4)前台如何完成登录注销
前台登录成功一般在cookie中保存认证信息token,分离注销就是前台主动清除保存的token信息
“”"

五、参考资料

jwt认证模块:https://www.cnblogs.com/guapitomjoy/p/11939050.html

jwt认证:https://www.cnblogs.com/guanxiying/p/13303206.html#_label3

你可能感兴趣的:(Django-DRF,python)