python 自定义jwt

安装
pip install pyjwt
使用
import time
import jwt
import datetime

print(datetime.datetime.now())
print(time.time() + 60, type(time.time()))
# payload
token_dict = {
    'exp': time.time() + 60,  # 时间戳  
    'name': 'lowman'  # 自定义的参数
}
"""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
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, "123",  # 进行加密签名的密钥
                       algorithm="HS256",  # 指明签名算法方式, 默认也是HS256
                       headers=headers  # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
                       ).decode('ascii')  # python3 编码后得到 bytes, 再进行解码(指明解码的格式), 得到一个str

print(jwt_token)

if __name__ == '__main__':
    import jwt

    # 将上面生成的 jwt 进行解析认证

    jwt_token1 = """eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MDU1MDc5ODAuMDM3NjE0 
    MywibmFtZSI6Imxvd21hbiJ9.SsQVjCYeYuupWQaw08Zq1JXQ5Ozg_tffuKErkfLj5bA"""

    data = None
    try:
        # 需要解析的 jwt        密钥                使用和加密时相同的算法
        data = jwt.decode(jwt_token1, "123", algorithms=['HS256'])
    except Exception as e:
        # 如果 jwt 被篡改过; 或者算法不正确; 如果设置有效时间, 过了有效期; 或者密钥不相同; 都会抛出相应的异常
        print(e)
        # 解析出来的就是 payload 内的数据
    print(data)  # 输出: {'iat': 1559276941.4208837, 'name': 'lowman'}
posted @ 2021-01-26 15:11  仰望丶那一缕微光  阅读(225)  评论(0编辑  收藏  举报