drf框架中的jwt认证

06-01 jwt认证

jwt

1.工作原理

  1. jwt = base64(头部).base64(载荷).hash256(base64(头部).base64(载荷).密钥)(签名)
  2. base64是可逆加密,可以通过解密获取头部中的用户信息
  3. hash256是不可逆算法
  4. 密钥是固定的字符串,保存在服务器

2.认证过程

  1. 用户登陆系统
  2. 服务端验证,将认证信息通过指定的算法(hash256)机制加密,例如对用户名和用户所属角色进行加密,加密私钥是保存在服务端的,将加密后的结果发送给客户端,加密的字符串格式为三个"."分隔的字符串Token,分别对应头部、载荷和签名,头部和载荷都可以通过base64解码出来,签名部分不可以
  3. 客户端拿到返回的Token,存储到cookie中
  4. 下次客户端再次发起请求,将Token附加到header中
  5. 服务端获取header中的Token,通过相同的算法对Token中的用户名和所属角色进行相同的加密验证,如果验证结果相同,则说明这个请求是正常的

3.jwt认证的优点

  1. 使用json作为数据传输,有广泛的通用性,并且体积小,便于传输
  2. jwt载荷部分可以存储业务相关的信息,不用频繁的访问数据库,减少服务端压力
  3. 便于集群

drf-jwt

官网

http://getblimp.github.io/django-rest-framework-jwt/

安装

pip install djangorestframework-jwt

配置信息:setings.py中配置JWT_AUTH

# settings.py
import datetime
JWT_AUTH = {
    # 过期时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

获取Token

from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler

def xxx(self, request):
    # 获取用户对象
    user = request.user
    # 传入user对象获取payload对象
    payload = jwt_payload_handle(user)
    # 传入payload对象获取token
    token = jwt_encode_handler(payload)

验证Token

在settings.py中配置:

# settings.py 中配置

# drf-jwt配置
import datetime

JWT_AUTH = {
    # token过期时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),

    # 是否允许刷新及刷新的过期时间
    'JWT_ALLOW_REFRESH': False,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

    # token校验前缀
    'JWT_AUTH_HEADER_PREFIX': 'jwt',

    # token md5 加密盐
    'JWT_SECRET_KEY': SECRET_KEY,
}

在views.py中使用:

# views.py 
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.view import APIView

class MyAPIView(APIView):
    authentication_classes = [JSONWebTokenAuthentication]
posted @ 2019-11-30 16:48  17vv  阅读(195)  评论(0编辑  收藏  举报