zoukankan      html  css  js  c++  java
  • drf框架中的jwt认证基础

    jwt认证

    jwt(json web token)优势:

    1、没有数据库写操作,高效

    2、服务器不存token,低耗

    3、签发校验都是算法,集群

    jwt认证和session示意

     

     

     

    jwt认证算法:签发与校验

    """
    1)jwt分三段式:头.体.签名 (head.payload.sgin)
    2)头和体是可逆加密,让服务器可以反解出user对象;签名是不可逆加密,保证整个token的安全性的
    3)头体签名三部分,都是采用json格式的字符串,进行加密,可逆加密一般采用base64算法,不可逆加密一般采用hash(md5)算法
    4)头中的内容是基本信息:公司信息、项目组信息、token采用的加密方式信息
    {
        "company": "公司信息",
        ...
    }
    5)体中的内容是关键信息:用户主键、用户名、签发时客户端信息(设备号、地址)、过期时间
    {
        "user_id": 1,
        ...
    }
    6)签名中的内容是安全信息:头的加密结果 + 体的加密结果 + 服务器不对外公开的安全码 进行md5加密
    {
        "head": "头的加密字符串",
        "payload": "体的加密字符串",
        "secret_key": "安全码"
    }
    """

    签发:根据登录请求提交来的 账号 + 密码 + 设备信息 签发 token

    """
    1)用基本信息存储json字典,采用base64算法加密得到 头字符串
    2)用关键信息存储json字典,采用base64算法加密得到 体字符串
    3)用头、体加密字符串再加安全码信息存储json字典,采用hash md5算法加密得到 签名字符串
    
    账号密码就能根据User表得到user对象,形成的三段字符串用 . 拼接成token返回给前台
    """

    校验:根据客户端带token的请求 反解出 user 对象

    """
    1)将token按 . 拆分为三段字符串,第一段 头加密字符串 一般不需要做任何处理
    2)第二段 体加密字符串,要反解出用户主键,通过主键从User表中就能得到登录用户,过期时间和设备信息都是安全信息,确保token没过期,且时同一设备来的
    3)再用 第一段 + 第二段 + 服务器安全码 不可逆md5加密,与第三段 签名字符串 进行碰撞校验,
    通过后才能代表第二段校验得到的user对象就是合法的登录用户
    """

    drf项目的jwt认证开发流程(重点)

    1、用账号密码访问登录接口,登录接口逻辑中调用 签发token 算法,得到token,返回给客户端,客户端自己存到cookies中

    2、校验token的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会进行认证校验,所以请

    求带了token,就会反解出user对象,在视图类中用request.user就能访问登录的用户

    注意:登录接口需要做 认证 + 权限 需要做两个局部禁用

    drf-jwt框架基本使用

    安装(终端)

    pip install djangorestframework-jwt 

    使用

    签发token(登录接口):视图类已经写好了,配置一下路由就行(urls.py)

    from rest_framework_jwt.views import ObtainJSONWebToken
    # api/urls.py
    urlpatterns = [
        # ...
        url('^login/$', ObtainJSONWebToken.as_view()),
    ]
    
    # Postman请求:/api/login/,提供username和password即可

    校验token(认证组件):认证类已经写好了,全局配置一下认证组件就行了(settings.py)

    # drf-jwt的配置
    import datetime
    JWT_AUTH = {
        # 配置过期时间
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    }
    
    
    # drf配置(把配置放在最下方)
    REST_FRAMEWORK = {
        # 自定义三大认证配置类们
        'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
        # 'DEFAULT_PERMISSION_CLASSES': [],
        # 'DEFAULT_THROTTLE_CLASSES': [],
    }

    设置需要登录才能访问的接口进行测试(views.py)

    from rest_framework.permissions import IsAuthenticated
    class UserCenterViewSet(GenericViewSet, mixins.RetrieveModelMixin):
        # 设置必须登录才能访问的权限类
        permission_classes = [IsAuthenticated, ]
    
        queryset = models.User.objects.filter(is_active=True).all()
        serializer_class = serializers.UserCenterSerializer

    测试访问登录认证接口(Postman)

    """
    1)用 {"username": "你的用户", "password": "你的密码"} 访问 /api/login/ 接口等到 token 字符串
    
    2)在请求头用 Authorization 携带 "jwt 登录得到的token" 访问 /api/user/center/1/ 接口访问个人中心
    """ 

    token刷新机制(了解)

    应用背景:12306这样极少数安全性要求高的网站

    第一个token由登录签发(签发的token在过期前都有效)

    之后的所有正常逻辑,都需要发送两次请求,第一次是刷新token的请求,第二次是正常逻辑的请求

    settings.py
    import datetime
    
    JWT_AUTH = {
        # 配置过期时间
        'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=5),
    
        # 是否可刷新
        'JWT_ALLOW_REFRESH': True,
        # 刷新过期时间
        'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
    }
    urls.py
    from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
    urlpatterns = [
        url('^login/$', ObtainJSONWebToken.as_view()),  # 登录签发token接口
        url('^refresh/$', RefreshJSONWebToken.as_view()),  # 刷新toekn接口
    ]
    Postman测试
    # 接口:/api/refresh/
    # 方法:post
    # 数据:{"token": "登录签发的token"}
  • 相关阅读:
    RequireJS进阶(二)
    JavaScript判断元素为数字的奇异写法
    RequireJS进阶(三)
    RequireJS进阶(一)
    读Ext之十四(Ext元素)
    JavaScript中__proto__与prototype的关系
    工作流术语
    一个例子(Hello World)
    无题
    再谈调用子流程(1)
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12358917.html
Copyright © 2011-2022 走看看