JWT认证
全称:Json web token (JWT)
主要用于web方向token的使用
JWT由来
https://www.cnblogs.com/liuqingzheng/p/8990027.html
token的签发认证流程
JWT的构成
# 分为三部分(头,荷载,签名),以.分割
eg:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
- 头:header
声明类型, 这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
以及一些公司信息。。。
-荷载:payload
-存放有效信息的地方
-过期时间
-签发时间
-用户id
-用户名字。。。
-签名:signature
-第一部分和第二部分通过秘钥+加密方式得到的
编码格式base64
import base64
import json
dic = {'id':2,'username':'tank'}
"用json把字典变成字符串"
dic_str = json.dumps(dic)
"b64encode编码需要bytes类型数据使用encode编码"
res = base64.b64encode(dic_str.encode('utf-8'))
print(res)
# b'eyJpZCI6IDIsICJ1c2VybmFtZSI6ICJ0YW5rIn0='
# 解码
ret=base64.b64decode('eyJpZCI6IDIsICJ1c2VybmFtZSI6ICJ0YW5rIn0=')
print(ret)
# b'{"id": 2, "username": "tank"}'
"注意base64编码长度后一定是4的倍数,如果解码时报错用=补齐"
base64在很多地方都可以使用
# base64 应用场景
'''
1 jwt 使用了base64
2 网络中传输数据,也会经常使用 base64编码 返回用户数据
3 网络传输中,有的图片使用base64编码,eg:12306 ....
'''
JWT开发重点
登录接口-->签发token
认证类 --->jwt认证
drf-jwt简单操作方法
在dango+drf平台开发,使用jwt有两个模块
djangorestframework-jwt 停更了但是还是一直可以用
djangorestframework-simplejwt 公司用的比较多,需要自己研究一下
或自己封装jwt签发和认证
安装
pip3.8 install djangorestframework-jwt -i https://pypi.douban.com/simple
基于auth用户表已经帮助我们写好了登录接口
签发
配置路由
from rest_framework_jwt.views import obtain_jwt_token
path('login/',obtain_jwt_token)
测试: 创建一个用户 python38 manage.py createsuperuser
使用postman携带数据发送post请求
发现返回的格式不符合我们的规范,自定义返回格式
定制返回格式
写个函数
我们在配置文件中配置的时候,发现rest_framework_jwt 的配置文件里已经有了配置导入了一个方法jwt_response_payload_handler 查看该方法 提示了我们应该怎么写和需要什么参数
新建一个utils.py文件
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code':100,
'msg':'登录成功',
'token':token,
'username':user.username,
}
配置文件配置
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
}
认证类
导入模块
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
"""
JSONWebTokenAuthentication: 判断带没带token,带了继续走,没带也能走(但是无法登录所以需要下面的权限类配合使用),带错的不行
IsAuthenticated : 登录才有权限,没登录不行。
"""
class BookView(ModelViewSet):
# 单独使用这个无法生效,需要配合drf的权限类
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = Book.objects.all()
serializer_class = BookSerializer
post请求 token必须遵循下列
放在请求头中:
-请求头中key值叫 Authorization
-请求头的value值是: jwt空格有效的token值
标签:编码,jwt,base64,JWT,用法,token,import
From: https://www.cnblogs.com/LiaJi/p/17106710.html