7Django-会话状态保持JWT基础知识点
方法 | 参数说明 | 返回值 |
---|---|---|
encode(payload, key, algorithm) | payload:字典类型的私有声明和公有声明,例如:{'username':'zhangsan','exp':1237365239} key:自定义的字符串,用于加密的key值,不要外泄 algorithm:声明你要用哪种算法签名,例如HS256 | token串,返回类型:bytes |
decode(token,key) | token:token串,参数类型bytes/str key:自定义的加密key,需要跟encode中的key保持一直,参数类型str issuer:发布者,若encode中的payload添加了iss字段,则可针对该字段进行校验,参数类型str audience:签发的受众群体,若encode内的payload中添加了aud字段,则可针对该字段校验,参数类型str | payload明文,返回类型是dict 若iss校验失败则抛出jwt.inavlidissuerError 若aud校验失败,则抛出jwt.InvalidAudienceError |
加密解密示例:
import jwt
#加密
s = jwt.encode({'name': 'zhangsan'}, '123456', algorithm='HS256')
print(s)
#解密
a = jwt.decode(s, '123456', algorithms='HS256')
print(a)
特殊说明:
若encode中payload添加了exp字段,则exp字段的值需为:当前时间戳+此token的有效期时间,例如:
希望token300秒后过期:
{'exp':time.time() + 300};
在执行decode时,若检查到exp字段,且token过期,则会抛异常jwt.ExpiredSignatureError,
示例:
import jwt
import time
s = jwt.encode({'name': 'zhangsan','exp':time.time()+3}, '123456', algorithm='HS256')
print(s)
time.sleep(4)
a = jwt.decode(s, '123456', algorithms='HS256')
print(a)
前后端分离场景下使用JWT:
原则:
1,JWT签发后,交由浏览器保存
2,浏览器可将其存储在”本地存储“中,不要存到cookies里,防范csrf攻击