zoukankan      html  css  js  c++  java
  • DRF之JWT简介

    一:认证规则图

    (1)Django前后端不分离

     (2)DRF分离

     二:认证规则演变图

    (1)数据库session认证

     PS:

      (1)验证低效率 

      (2)当有大量的用户存储在数据库中 查表会很慢

    (2)缓存认证

     PS:在缓存中有I/O操作

    (3)JWT认证

     (4)缓存认证 不易并发

     (5)缓存认证 易并发

     三:JWT简介

    (1)作用

      (1)服务端产生token 传输给客户端 服务端不需要保存token减小服务端压力

      (2)服务端存储的是签发和认证的两端算法 

      (3)算法完成各集群服务器同步成本低,路由项目完成集群部署(适应高并发)

    (2)格式

    (1)采用三段式格式 头部 + 载荷 + 签名

    (2)每一部分都是一个json字典加密之后形成的字符串

    (3)头部 + 载荷 实验bases64位加密算法 该算法可逆

    (4)签名采用hash256 不可逆

    (5)格式内容

      (1)头部:基础信息 ---> 公司名称 项目组信息等等

      (2)载荷:有用但是非隐私信息 --- > 用户公开信息 过期时间等

      (3)签名:头部 + 载荷 + 秘钥 不可逆算法

    (6)签发token:

      (1)头部可逆算法加密  ---> 固定头部信息加密

      (2)载荷可逆算法加密 ---> 当前用户 过期时间加密

      (3)签名不可逆算法  ---> 头部 + 载荷 + 秘钥生成不可逆加密

    (7)校验token:

      (1)头部校验可选

      (2)载荷校验用户与过期时间

      (3)签名检验 头部 + 载荷 + 秘钥检验token是否被篡改

    (3)使用安装

    (1)官网

    https://github.com/jpadilla/django-rest-framework-jwt

    (2)安装

    pip3 install djangorestframework-jwt

    (3)签发token

    # 两者签发token方式是相同的
    from rest_framework_jwt.views import ObtainJSONWebToken,obtain_jwt_token
    urlpatterns = [
      
        url(r'^login/$', ObtainJSONWebToken.as_view()),
        url(r'^login/$', obtain_jwt_token)
    
    ]

    PS:

      (1)此时get方法不被允许

      (2)只有post会被允许

    (4)验证信息输入与结果

    {
        "username":"admin",
        "password":"admin123"
    }
    PS:
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTcxNzUzODY5LCJlbWFpbCI6IiJ9.rkI5BYdq9HFmIIW0Z8H7zb1g-XA4SYSy_RY5DKbuupM"

    PS:

      (1)数据错误不会反会信息

      (2)每次发送token都会改变

    (5)认证校验token

    # 路由层
       url(r'^test_token/$', views.Login.as_view()),
    # 视图层
    # 只有登录且通过认证的用户才可以访问

    from rest_framework_jwt.authentication import JSONWebTokenAuthentication   # 查看是否通过认证
    from rest_framework.permissions import IsAuthenticated # 用户必须登录
    class Login(APIView):
    
        permission_classes = [IsAuthenticated]   # 局部验证用户必须登录
    
        authentication_classes = [JSONWebTokenAuthentication]   # 局部检验token
        def get(self,request,*args,**kwargs):
    
           return Response({
               'status':0,
               'msg':'测试成功',
               'results':request.user.username
           })
  • 相关阅读:
    新项目反思
    nei网访问
    react
    css沉默
    沉默
    node准备
    C++学习(八):删除文件
    利用工具格式化日期文本
    PageHelper 记录总条数不正确问题处理
    tk.mybatis 多个or条件拼接
  • 原文地址:https://www.cnblogs.com/SR-Program/p/11722252.html
Copyright © 2011-2022 走看看