drf框架中的jwt认证
06-01 jwt认证
jwt
1.工作原理
- jwt = base64(头部).base64(载荷).hash256(base64(头部).base64(载荷).密钥)(签名)
- base64是可逆加密,可以通过解密获取头部中的用户信息
- hash256是不可逆算法
- 密钥是固定的字符串,保存在服务器
2.认证过程
- 用户登陆系统
- 服务端验证,将认证信息通过指定的算法(hash256)机制加密,例如对用户名和用户所属角色进行加密,加密私钥是保存在服务端的,将加密后的结果发送给客户端,加密的字符串格式为三个"."分隔的字符串Token,分别对应头部、载荷和签名,头部和载荷都可以通过base64解码出来,签名部分不可以
- 客户端拿到返回的Token,存储到cookie中
- 下次客户端再次发起请求,将Token附加到header中
- 服务端获取header中的Token,通过相同的算法对Token中的用户名和所属角色进行相同的加密验证,如果验证结果相同,则说明这个请求是正常的
3.jwt认证的优点
- 使用json作为数据传输,有广泛的通用性,并且体积小,便于传输
- jwt载荷部分可以存储业务相关的信息,不用频繁的访问数据库,减少服务端压力
- 便于集群
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]