python jwt模块使用

举报
Python爱好者 发表于 2021/04/26 14:43:57 2021/04/26
【摘要】 Python实现JWT加密解密
JWT有三种签名算法:
    对称加密HMAC: HS256/HS384/HS512
    非对称加密RSASSA: RS256/RS384/RS512
    椭圆曲线签名ECDSA: ES256/ES384/ES512

加密

import time
import jwt

# payload
token_dict = {
    'iat': time.time(),  # 时间戳
    'name': 'wuyuqing'  # 自定义的参数
}
"""payload 中一些固定参数名称的意义, 同时可以在payload中自定义参数
# iss  【issuer】发布者的url地址
# sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段
# aud 【audience】接受者的url地址
# exp 【expiration】 该jwt销毁的时间;unix时间戳
# nbf  【not before】 该jwt的使用时间不能早于该时间;unix时间戳
# iat   【issued at】 该jwt的发布时间;unix 时间戳
# jti    【JWT ID】 该jwt的唯一ID编号
"""
headers = {
    'alg': "HS256",  # 声明所使用的算法
}
"""headers 中一些固定参数名称的意义"""
# jku: 发送JWK的地址;最好用HTTPS来传输
# jwk: 就是之前说的JWK
# kid: jwk的ID编号
# x5u: 指向一组X509公共证书的URL
# x5c: X509证书链
# x5t:X509证书的SHA-1指纹
# x5t#S256: X509证书的SHA-256指纹
# typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。
# crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。

# 调用jwt库,生成json web token
jwt_token = jwt.encode(
    token_dict,  # payload, 有效载体
    "key123123",  # 进行加密签名的密钥
    algorithm="HS256",  # 指明签名算法方式, 默认也是HS256
    headers=headers  # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
).decode('ascii')  # python3 编码后得到 bytes, 再进行解码(指明解码的格式), 得到一个str

print(jwt_token)



解密
import jwt
# 将上面生成的 jwt 进行解析认证
jwt_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDA4MzQzMDY" \
            "uMTU0MzI4LCJuYW1lIjoid3V5dXFpbmcifQ.TToEHfqs4GEr3IfJdI_" \
            "5T9xr5nmwmHflsUX0Cq2wM_A"
data = None
try:
    # 需要解析的 jwt密钥 使用和加密时相同的算法
    data = jwt.decode(jwt_token,
                      "key123123",
                      algorithms=['HS256']
                      )
except Exception as e:
    # 如果jwt被篡改过;或者算法不正确;如果设置有效时间,过了有效期;或者密钥不相同等都会抛出相应的异常
    print(e)
print(data)










【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。