什么是JWT
要了解jwt的生成及验证,首先要了解什么是jwt。jwt是json web token的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,该token被设计紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。jwt的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必需的声明信息,该token也可以直接被用于认证,也可以被加密。
JWT
jwt是由三段信息通过点号拼接而成,例如:
JWT的生成
jwt由三部分组成,第一部分header,第二部分payload,第三部分(signature)由第一部分和第二部分通过点号连接,然后使用HS256算法进行哈希加密,然后base64编码
第一部分header里面一般有类型和加密的算法等信息;第二部分payload一般存储像用户名、手机号、过期时间等一些不敏感信息,也可自行扩充。这两部分用的都是base64编码,因为可以被其他人base64解密,所以不建议存储敏感信息;第三部分相比于前两部分要安全些,因为哈希加密是单向不可逆的
代码部分
import jwt
from flask import current_app
# 生成token
def generate_token(payload,expiry):
# 组织payload
_payload = {
'exp':expiry # 有效期
}
_payload.update(payload)
# 读取配置文件中的secret_key
_key = current_app.config.get("SECRET_KEY")
# 生成token
token = jwt.encode(payload=_payload,key=_key)
return token
SECRET_KEY中配置的变量是通用密钥, 主要在加密的过程中作为算法的一个参数,这个值的简易程度影响着数据传输和存储时的简易程度,考虑到安全性,SECRET_KEY最好存储在系统的环境变量中
_payload.update(payload)更新payload,在token更新时使用
JWT的认证
当服务器接收到一个JwtToken的时候,首先要对这个JwtToken的完整性进行验证,这个就是签名认证。将token字符串从右边开始以"."进行一次分割,得到签名输入部分(header+payload), 对签名输入部分进行哈希加密(使用header中声明的算法),然后base64编码,将编码结果中的"="替换为" ",然后与签名进行对比,如果一致说明认证成功,不一致说明认证失败。
代码部分
import jwt
from flask import current_app,jsonify
# 校验token
def verify_token(token):
# 读取配置文件中的secrey_key
_key = current_app.config.get("SECRET_KEY")
try:
payload = jwt.decode(token,key=_key,algorithms=['HS256'])
return payload
except Exception as e:
print("失败原因>>",e)
return jsonify(msg="验证失败",code=401)