simplejwt双token

pyJwt 安装
pipPyJWT
JWT参数
# JWT官网的三个加密参数为# 1.header(type,algorithm)#{#"alg": "HS256",#"typ": "JWT"#}# 2.playload(iss,sub,aud,exp,nbf,lat,jti)#iss: jwt签发者#sub: jwt所面向的用户#aud: 接收jwt的一方#exp: jwt的过期时间,这个过期时间必须要大于签发时间#nbf: 定义在什么时间之前,该jwt都是不可用的.#iat: jwt的签发时间#jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击 。# 3.signature# jwt的第三部分是一个签证信息,这个签证信息由三部分组成:#header (base64后的)#payload (base64后的)#secret# PyJwt官网的三个加密参数为# jwt.encode(playload, key, algorithm='HS256')# playload 同上,key为SECRET_KEY,algorithm 为加密算法
使用
import jwtfrom jwt import ExpiredSignatureErrorfrom pytz import timezonesecret = "f7aa59c6-fd5d-407b-862b-f4d2d2ecf0de"issuer = "General_zy"audience = "user"def encode_token():import datetime# 这里需要指明时区为Asia/Shanghai,否则token会+8:00now = datetime.datetime.now(tz=timezone('Asia/Shanghai'))dic = {# 过期时间'exp': now + datetime.timedelta(seconds=5),# 签发时间'iat': now,# 签发方'iss': issuer,# 接收人"aud": audience,}token_bytes = jwt.encode(dic, key=secret, algorithm='HS256')return token_bytes.decode("utf-8")def decode_token(token):if isinstance(token, str):token = token.encode("utf-8")# 解密,校验签名try:payload = jwt.decode(token, key=secret, issuer=issuer, audience=audience, algorithms=['HS256'])return payloadexcept ExpiredSignatureError as e:print(f"token过期:{str(e)}")return Noneexcept Exception as e:print(f"其他错误:{str(e)}")if __name__ == '__main__':# 1. 生成token# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzQyMDU4NzcsImlhdCI6MTY3NDIwNTg3MiwiaXNzIjoiR2VuZXJhbF96eSIsImF1ZCI6InVzZXIifQ.O_LUfOP4fXnFsRgGZrCEjxW8nD5WB3s8WBXNsUsIqToprint(encode_token())# 2. 解码tokendata = http://www.kingceram.com/post/decode_token("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzQyMDU4NzcsImlhdCI6MTY3NDIwNTg3MiwiaXNzIjoiR2VuZXJhbF96eSIsImF1ZCI6InVzZXIifQ.O_LUfOP4fXnFsRgGZrCEjxW8nD5WB3s8WBXNsUsIqTo")print(data)
参数详解
expexp指过期时间,在生成token时,可以设置该token的有效时间,如果设置1天过期,1天后再解析此token会抛出jwt.exceptions.ExpiredSignatureError: Signature has expirednbfnbf类似于token的 lat ,它指的是该token的生效时间,如果使用但是没到生效时间则抛出jwt.exceptions.ImmatureSignatureError: The token is not yet valid (nbf)ississ指的是该token的签发者,可以给一个字符串 。iss 在接收时如果不检验也没有问题,如果接收时需要检验但是又签名不一致,则会抛出jwt.exceptions.InvalidIssuerError: Invalid issueraudaud指定了接收者,接收者在接收时必须提供与token要求的一致的接收者(字符串),如果没写接收者或者接收者不一致会抛出jwt.exceptions.InvalidAudienceError: Invalid audienceiatiat指的是token的开始时间,如果当前时间在开始时间之前则抛出jwt.exceptions.InvalidIssuedAtError: Issued At claim (iat) cannot be in the future.
双token
双token即两个token,首次登陆时服务端返回两个token ,和,过期时间比较短,时间较长,且每次使用后会刷新,每次刷新后的都是不同的 。
解决的问题

simplejwt双token

文章插图
用户正在app或者应用中操作 token突然过期,此时用户不得不返回登陆界面,重新进行一次登录,这种体验性不好,于是引入双token校验机制 。
流程
的存在,保证了登录态的正常验证,因其过期时间的短暂也保证了帐号的安全性