# 如果有错误的地方, 请留言指正
"""
想要使用代码访问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)
"""