首页 > 其他分享 >jwt用法

jwt用法

时间:2023-02-09 18:56:02浏览次数:52  
标签:编码 jwt base64 JWT 用法 token import

JWT认证

全称:Json web token (JWT)

主要用于web方向token的使用

JWT由来

https://www.cnblogs.com/liuqingzheng/p/8990027.html

token的签发认证流程

image

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请求

image

发现返回的格式不符合我们的规范,自定义返回格式

定制返回格式

写个函数

我们在配置文件中配置的时候,发现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,

    }

image

配置文件配置


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    

image

post请求 token必须遵循下列
放在请求头中:
    -请求头中key值叫		Authorization
    -请求头的value值是:  jwt空格有效的token值

标签:编码,jwt,base64,JWT,用法,token,import
From: https://www.cnblogs.com/LiaJi/p/17106710.html

相关文章