JWT相关总结

# 如果有错误的地方, 请留言指正

"""
    想要使用代码访问JWT验证登录的接口,
    就是在请求体中加入一个键值对
    header = {
        '''
        "Authorization": "JWT " + 登录接口返回的token
        '''
        }
"""


# 1_访问登录接口
import requests

url = "http://192.168.222.136:6062/api/v1/obtain_token/"

data = {"username": "哈哈哈", "password": "123456"}

ret = requests.post(url, data=data)
print(ret.json())

# 2_访问其他接口
create_url = "http://192.168.222.136:6062/create_ticket/"
header = dict()    # 为了省事直接创建的空字典
header["Authorization"] = 'JWT ' + ret.json()["token"]    # 注意JWT后有个空格

ret_create = requests.post(create_url, headers=header)
print(ret_create.json())

# 3_获取jwt的信息
import base64

#  1_获取token头部
jwt_token = ret.json()["token"].split('.')
token_header = base64.b64decode(jwt_token[0])

#  2_获取token载荷
"""
    注意, 获取token_playload的时候有可能会报错 ---> binascii.Error: Incorrect padding
    参考资料 http://outofmemory.cn/code-snippet/35649/python-base64.decode-incorrect-padding-solution
"""
data = jwt_token[1]
missing_padding = 4 - len(data) % 4
data2 = data + '='*missing_padding
token_playload = base64.b64decode(data2)

print(token_header)
print(token_playload)


# 4_自定义jwt的返回值
# 场景一: 用户正常登录,需要返回用户的信息
"""
    
    1-  utils.py文件定义方法
        
        def jwt_response_payload_handler(token, user=None, request=None):
            user_id = user.id
            user_role_info = Users.objects.filter(user=user_id).first()
            user_role_id = user_role_info.role
        
            return {
                'code': 1,
                'token': token,
                'user_id': user.id,
                'username': user.username,
                # users表中的字段
            }
        
        
    2-settings的配置文件中
    
            
        JWT_AUTH = {
            ...
        
            # jwt返回数据
            'JWT_RESPONSE_PAYLOAD_HANDLER': 'account.utils.jwt_response_payload_handler',
        }


"""
#  场景2_如果前端传入的token过期.或者错误的token
"""
   
    1- 定义中间键
        error_list = [
            {"detail": "Signature has expired."},
            {"detail": "Error decoding signature."},
            {"detail": "Authentication credentials were not provided."}
        ]
        
        
        class DataReCordMiddleware(object):
        
            def __init__(self, get_response):
                self.get_response = get_response
        
            def __call__(self, request):
                response = self.get_response(request)
                data = None
                if hasattr(response, 'data'):
                    data = response.data
                    if data in error_list:
                        response.data = {
                            'code': -999,
                            'data': data,
                            'msg': 'OK'
                        }
                        response.status_code = 200
                    response._is_rendered = False
                    response.render()
                return response
    
    2-注册中间键
            
        MIDDLEWARE = [
            ....
            'account.middleware.DataReCordMiddleware',
        ]
"""


"""5_如果有2个未过期的token,如果识别错误的token"""
"""
    场景: 
        后台jwt 时效为2天
        第一天我登录, 获取token1, 被人截获 
        第二天我登录获取token2

        此时token1 和token2 都可以正常使用

    解决方法:
        user表添加 last_login字段
        使用token中的时间和last_login时间做对比 
        如果token的生成时间 小于 last_login时间, 那么这个token一定是token1(无效的token)
"""
发布了73 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42327755/article/details/93510451
jwt