Python⽣成JWT(jsonwebtoken)及解析⽅式
⼀.python 对于 jwt 的实现, ⽬前已经存在了⼀些第三⽅的库, 相信学习过 python 的程序猿都知道 itsdangerous 这个库了, 它的底层原理就是基于 jwt 进⾏实现的
这⾥需要进⾏提醒的是:
itsdangerous (使⽤固定密钥/字符串进⾏加密, jwt 有多种加密⽅式, 这只是其中⼀种, 建议先去了解⼀下)所⽣成的 token 仍然是可以被破译从⽽看到 jwt 的 payload(有效负载) ⾥的数据, 只不过因为破译者并不知道加密的密钥, 也就⽆法对数据进⾏篡改, 所以如果是私密的数据,就不应该使⽤ jwt 进⾏传递, 如 账号的密码, 以防⽌泄露.
如果需要传递私密数据, 解决办法是,对 payload 的数据进⾏加密,从⽽杜绝⾮法破译者看到 payload 内的任何信息,但是⽬前加密payload的操作不是很普及,在不加密 payload 的前提下, jwt ⽐较适合进⾏⾮受信任端的⾝份验证, 此时即使接收⽅破译了 token, 看到了 payload 的数据, 也不会造成太⼤的影响,
因为数据是⽆法被篡改的(当接收⽅将 token 值返回给服务器后, 需要使⽤相同的密钥进⾏解密, 所以服务器的密钥⼀定要保管好), 只要接收⽅将 token 原封不动的返回给服务器, 那么服务器就可以根据 token 值的内容来确认接收⽅⾝份的合法性,⽽不需要关⼼接收⽅是否看到过payload 的内容.
简⽽⾔之, 除⾮额外对 payload 加密过, 否则就不要在 jwt 中传递不可被第三⽅获知的私密数据
⼆. python实现⽣成 json web token
环境: python3.6.7
依赖包: jwt, time
1)JWT 的签名算法有三种。
对称加密HMAC【哈希消息验证码】 HS256/HS384/HS512
这种加密⽅式没有公钥,私钥之分, 也就是只有⼀个密钥, 这种加密⽅式适⽤于: 服务器将⽣成的jwt发送给接收⽅, 接收⽅将其返回给服务器, 服务器解析 jwt, 完成⾝份验证.
⾮对称加密RSASSA【RSA签名算法】RS256/RS384/RS512
ECDSA【椭圆曲线数据签名算法】 ES256/ES384/ES512
2).对称加密HMAC ⽣成 jwt
import time
import jwt
# payload
token_dict ={
'iat': time.time(),# 时间戳
linuxer 'name':'lowman'# ⾃定义的参数
}
"""payload 中⼀些固定参数名称的意义, 同时可以在payload中⾃定义参数"""
# iss 【issuer】发布者的url地址
# sub 【subject】该JWT所⾯向的⽤户,⽤于处理特定应⽤,不是常⽤的字段
# aud 【audience】接受者的url地址
# exp 【expiration】该jwt销毁的时间;unix时间戳
ascii字符画生成器
# nbf 【not before】该jwt的使⽤时间不能早于该时间;unix时间戳
# iat 【issued at】该jwt的发布时间;unix 时间戳
# jti 【JWT ID】该jwt的唯⼀ID编号
# headers
headers ={
'alg':"HS256",# 声明所使⽤的算法
}
"""headers 中⼀些固定参数名称的意义"""
# jku: 发送JWK的地址;最好⽤HTTPS来传输
# jwk: 就是之前说的JWK
# kid: jwk的ID编号
css居中对齐方式
# x5u: 指向⼀组X509公共证书的URL
# x5c: X509证书链
# x5t:X509证书的SHA-1指纹
# x5t#S256: X509证书的SHA-256指纹
# typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后⽂会说及。适⽤于JOSE标头的对象与此JWT混合的情况。
positionrelative是什么意思# crit: 字符串数组,包含声明的名称,⽤作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。
# 调⽤jwt库,⽣成json web token
jwt_token = de(token_dict,# payload, 有效载体
"zhananbudanchou9527269",# 进⾏加密签名的密钥
algorithm="HS256",# 指明签名算法⽅式, 默认也是HS256
headers=headers # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
).decode('ascii')# python3 编码后得到 bytes, 再进⾏解码(指明解码的格式), 得到⼀个str
print(jwt_token)
# 个⼈测试⽣成结果如下: JpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbi J9.GyQhOJK8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY
3).使⽤ python 对 jwt 进⾏解析
最好的免费自学网站import jwt
python请求并解析json数据# 将上⾯⽣成的 jwt 进⾏解析认证
jwt_token ="JpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbiJ9.GyQhOJ K8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY"
data =None
try:
# 需要解析的 jwt 密钥使⽤和加密时相同的算法
data = jwt.decode(token,"zhananbudanchou9527269", algorithms=['HS256'])
except Exception as e:
# 如果 jwt 被篡改过; 或者算法不正确; 如果设置有效时间, 过了有效期; 或者密钥不相同; 都会抛出相应的异常
print(e)
# 解析出来的就是 payload 内的数据
print(data)
# 输出: {'iat': 1559276941.4208837, 'name': 'lowman'}
4).如果是使⽤私钥公钥进⾏加密解密的⽅式(由请求⽅使⽤私钥进⾏加密⽣成 jwt, 接收⽅使⽤公钥解密), 只需要将相应参数更换成私钥(将私钥证书读取出来, 赋值给相应参数即可), 并使⽤双⽅约定好的的
签名算法
5).python 对于 jwt 的实现, 已经有了 itsdangerous 这个库做了很好的⽀撑, 使⽤起来还是很⽅便的, ⼤家可以⾃⾏去了解⼀下.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论