一、jwt的介绍
jwt(json web tokens)是一种用于在网络应用环境间安全地传输信息的简洁的、url安全的令牌标准。jwt的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、jwt的组成
jwt的结构分为三部分,它是用点来分割的,header(头部),payload(负载),signature(签名)。如下图
1、header(头部)
头部通常包含了两部分信息:声明类型和使用什么算法,第一部分就是将json转化为字符串,然后用base64加密,如下格式
{ "alg":"hs256", "type":"jwt" }
2、payload(负载)
负载里面通常就是我们要传递给前端的值,如用户的一些信息啊,也是将json转换为字符串,然后用base64加密,如下格式
{ "id":"123", "username":"xiaoming" }
3、signature(签名)
签名的作用是保证jwt的未被篡改。签名的生成方式是将编码后的头部、编码后的负载、秘密通过指定的算法进行签名。签名的作用是保证jwt的发送者不能抵赖自己发送的消息,接收者能够验证消息的完整性。这里是将前2部分的密文拼接起来,对这2部分进行hs256加密,然后加盐,最后在对加密后的内容用base64加密一次
三、python写jwt
1、安装jwt
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyjwt
2、使用jwt
import datetime import jwt def create_jwt(): headers = { 'alg': 'hs256', 'typ': 'jwt' } # jwt的头部,包含了类型和算法的指定 payload = { "id": 123, "username": '小明', 'exp': datetime.datetime.utcnow() datetime.timedelta(hours=12), } # jwt的负载,都是一些自定义值,其中exp中的内容是我们指定jwt的一个有效时间,有效时间为12个小时 token = jwt.encode(headers=headers, payload=payload, algorithm='hs256', key='123') # 对上面内容进行加密,这里的key就是加的盐 print(token) if __name__ == '__main__': create_jwt()
3、解密jwt
import datetime import jwt def create_jwt(): headers = { 'alg': 'hs256', 'typ': 'jwt' } # jwt的头部,包含了类型和算法的指定 payload = { "id": 123, "username": '小明', 'exp': datetime.datetime.utcnow() datetime.timedelta(hours=12), } # jwt的负载,都是一些自定义值,其中exp中的内容是我们指定jwt的一个有效时间,有效时间为12个小时 token = jwt.encode(headers=headers, payload=payload, algorithm='hs256', key='123') # 对上面内容进行加密,这里的key就是加的盐,是自定义的,我们在使用盐的时候一般是唯一的一个值 print(token) return token def decode_jwt(token): content = jwt.decode(jwt=token, key='123', algorithms=['hs256']) # 对jwt进行解密,这里用的key必须和上面用的key一样,否则是无法解密出来的 print(content) if __name__ == '__main__': token = create_jwt() decode_jwt(token)
解密出来的结果如下图