1.概念
客户端:频繁请求呼叫
服务端:频繁的区数据库查询用户名和密码进行校验,增加服务器压力
当登陆成功后,我们希望在某段时间内,维持登陆状态,不需要重复的进行用户名和密码的校验,token应运而生
token:服务端生成的一串字符串,客户端请求的令牌
客户端第一次登陆后,服务器生成一个token,以后客户端请求数据,只需携带token
2.安装
基于jwt标准的token
pip3 install pyjwt
3.组成
header.payload.signature
# header
# 1.alg加密算法,如果是未加密的token,设置成None;2.类型typ
headers = {'alg': 'HS256', 'typ': 'JWT'}
# payload
"""
iss: issuer jwt签发者
sub: sunbject jwt面向的用户
exp: expiration time jwt的过期时间,注意,必须大于签发时间
iat: issued at jwt的签发时间
"""
from datetime import datetime, timedelta
payload = {
'iss': 'LoginView_post',
'sub': 'login',
'iat': int(datetime.now().timestamp()),
'exp': datetime.now()+timedelta(days=1),
'data': 'lee@qq.com'
}
# signature
header.payload通过header里面声明的算法进行加盐(secret_key)组合加密
# 生成token
TOKEN_SECRET_KEY = 'feifei_FFmall' # 随机指定加盐密钥
encode_jwt = jwt.encode(payload, TOKEN_SECRET_KEY, algorithm='HS256', headers=headers)
# 拆解token
jwt.decode(encode_jwt, TOKEN_SECRET_KEY, algorithms=['HS256'])
4.应用
import jwt
from datetime import datetime, timedelta
class LoginView(View):
@method_decorator(verifyParam('email', 'password', 'verify'))
def post(self, request, uuid):
post = request.POST
email = post.get('email')
password = post.get('password')
verify = post.get('verify')
...
payload = {
'iss': 'LoginView_post',
'sub': 'login',
'iat': int(datetime.now().timestamp()),
'exp': datetime.now()+timedelta(days=1),
'data': email,
}
# 编码token
encode_jwt = jwt.encode(payload, token_conf.TOKEN_SECRET_KEY, algorithm='HS256', headers=token_conf.headers)
# 校验通过后,返回成功
return ResFormat(data=encode_jwt).json_response()