zoukankan      html  css  js  c++  java
  • Django rest-framework的jwt认证

    jwt认证

    jwt 是json web token的缩写,是一种登录认证的认证方式

    jwt认证和普通session认证的区别

    1. session需要保存至服务端数据库中,而jwt服务器不需要存储token,服务器的IO操作会减少(没有IO写操作)
    2. 由客户端存储token信息,服务端只存储签发和校验的算法,服务端代码执行效率高
    3. 采用三段式,token中必须包含过期时间,保证token的安全性和时效性

    jwt认证组成

    • jwt 由 头.载荷.签名 三部分组成,中间由 .拼接而成
    • 每部分都是一个json字典,头和载荷采用base64可逆加密算法加密,签名采用HS256不可逆加密算法算法

    jwt认证组成介绍:

    • jwt头:包含一些无关紧要说明性的信息:公司名称、开发者信息,内容也可以为空
    • jwt载荷:包含核心信息:用户主键、账号信息、客户端设备信息、token的过期时间等
    • jwt签名:包含安全信息,头的加密结果,载荷的加密结果、服务器的安全码(盐)

    jwt的签发算法

    总共分为4部,只有在用户重新登录时才会再次签发新的token,如果原token没有超过过期时间,也是有效的,并且会在每个需要登录的接口中客户端会携带token与服务端校验

    头部算法

    • 头部内容:公司名称、项目信息,也可以为空
    • 将这些数据转换为json字符串,再讲json字符串加密成base64字符串

    载荷部分的算法

    • 载荷部分的内容:用户账号、客户端设备信息、用户主键信息(需要提供用户账号并验证ton过后才可以拿到)、过期时间(根据当前时间与配置的过期时间相结合产生)
    • 将这些数据转换为json字符串,再讲json字符串加密成base64字符串

    签名部分的算法

    • 签名部分的内容:将头部内容加密结果,载荷部分内容加密结果作为成员,再从服务器上获取安全码
    • 将这些数据转换为json字符串,再讲json字符串加密成不可逆的HS256字符串

    连接生成token

    • 将三个字符串用.拼接产生三段式token

    jwt的校验算法

    总共可以分为五部来做:

    切分

    • 从客户端提交的请求中拿到token,用.切割成三段,如果不是三段,非法token

    解密头部

    看情况,一般不需要解密,因为固定不变的。

    解密载荷

    • 先用base64解密成json字符串,再转换成python格式的字典数据
      • 查询User表确定用户账号是否存在
      • 本次请求的信息和解密后的载荷中的信息比对,确定是否是同一用户或设备,决定对用户是否做安全提示(eg:异地登录)
      • 过期时间与当前时间比对,判断该token是否在有效时间内

    碰撞校验签名

    • 将用户最新提交的token中头、载荷、服务端的安全码组成字典转换成json字符串
    • 采用不可逆HS256加密算法对新组成的json字符串加密产生新的签名字符串
    • 新的签名字符串与第三段签名碰撞比对,一致的话才能确保token是合法的。

    校验用户对象

    • 以上算法都通过后,载荷校验得到的User对象,就是该token代表的登录用户(django中一般把登录用户存放在request.user中)

    jwt的刷新算法

    刷新算法就是在前发完token后,在token的有效时间内,用户每次提交请求时都会刷新该token的有效时间

    刷新算法的实现:

    • 要在签发token的载荷中,额外添加两个时间信息:第一次签发token的时间,最多往后刷新的有效时间
    • 每次请求携带token不仅走校验算法验证token,还要额外请求刷新token的接口,完成token的刷新
    • 服务器不仅要配置过期时间,还要配置最长刷新时间

    jwt认证的优点

    • 数据库不需要存储token,没有IO写操作
    • 客户端存储token,服务器只存储签发与校验的算法,代码执行效率高
    • 签发与校验算法在多个服务器上统一,在jwt规则下服务器做集群非常便捷

    DRF中的jwt认证

    安装

    pip3 install djangorestframework-jwt
    

    使用自带设定好的jwt

    from rest_framework_jwt.views import obtain_jwt_token
    urlpatterns = [
        url(r'^login/',obtain_jwt_token),
    ]
    '''
    path('login/', obtain_jwt_token)其实相当于path('login/', ObtainJSONWebToken.as_view())
    因为我们之间进源码可以看到
    obtain_jwt_token = ObtainJSONWebToken.as_view()     #获得
    refresh_jwt_token = RefreshJSONWebToken.as_view()   #刷新
    verify_jwt_token = VerifyJSONWebToken.as_view()     #验证
    '''
    

    测试接口:post请求

    postman发生post请求
    接口:http://127.0.0.1:8000/api/login/
    
    数据:
    {
        "username":"admin",
        "password":"admin123"
    }
    
    返回一个token字符串
    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTc3ODc0MzU0LCJlbWFpbCI6IiJ9.5z8Ya-mxj-oPSOwdXenSKUWf7M5pt3r8YVlFKu1cskY"
    }
    

    工作原理

    """
    jwt:json web tokens 采用json格式在web上传输的 认证字符串
    
    jwt字符串:头.载荷.签名
    
    头:公司基本信息、项目组基本信息、常规加密算法名
    载荷:用户信息、过期时间
    签名:头、载荷、秘钥
    
    {头信息字典,采用base64加密算法}.{载荷信息字典,采用base64加密(base64编码)}.{头加密串、载荷加密串、服务器秘钥,采用hs256加密算法}
    
    base64是可逆的
    hash256是不可逆加密
    我们一般只会将账号信息,过期时间放载荷里面,一般把密码什么重要信息丢签名里面
    
  • 相关阅读:
    幻灯片效果
    国外空间乱码的解决方法
    图片自动适应
    css圆角效
    iframe自适应兼容
    css圆角
    图片自动适应2
    JQuery实现智能输入提示(仿机票预订网站)
    AppDiag类
    c# 渐变算法
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12154343.html
Copyright © 2011-2022 走看看