Json web token (JWT)简介

JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).

JWT组成

JWT 实际上是一个字符串,它由三部分组成:头部(Header)、载荷(Payload)与签名(Signature),使用英文"点"隔开。
格式:

Header.Payload.Signature
Base64(Header).Base64(Payload).H256(Header.Payload)

示例:为了清晰在分隔符处,进行了断行,实际是一个字符串,没有断开。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpZGVudGl0eSI6InRvbUBxcS5jb20iLCJpYXQiOjE1OTM0ODA2ODcsIm5iZiI6MTU5MzQ4MDY4NywiZXhwIjoxNTkzNTIzODg3fQ.
1G3fAiXgzsAVAzbrOWEjceuL4tH5-Nrd_UHRx-PZx6g

生成JWT(Python代码)

import jwt

    # Header
    headers = {
        "alg": "HS256",  # 声明所使用的算法
    }
    # Payload
    token = {
        "identity": "[email protected]",  # 自定义属性
        "iat": 1593480687,  # 发布时间 time.time()
        "nbf": 1593480687,  # 使用时间不能早于该时间
        "exp": 1593523887   # 过期时间
    }
    # 生成JWT字符串
    jwt_token = jwt.encode(token,
                           "abc123",  # 签名密钥
                           algorithm="HS256",  # 指明签名算法方式, 默认HS256
                           headers=headers
                           )
    # 将bytes转换为str
    jwt_token = str(jwt_token, encoding="ascii")
    print(jwt_token)

base64解码

import base64
s = base64.b64decode('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9')
print(s)

输出:b’{“typ”:“JWT”,“alg”:“HS256”}’

解码 binascii.Error: Incorrect padding

Base64是三个字节(Bytes)作为一组(24-bit block)的编码转换,如果字节数不是三的倍数,那么就会出最后一组只有一个或者两个字节的情况。我们经常会在Base64编码字符串中看到最后有“=”字符,这就是通过填充生成的。填充就是当出现编码时的情况2和3时,在后面补上“=”字符,使编码后的字符数为4的倍数。

jwtlist = jwt_token.split('.')
for i in range(2):
	item = jwtlist[i]
	missing_padding = 4 - len(item) % 4
	item += ('=' * missing_padding) if missing_padding != 4 else ''
	print(base64.b64decode(item))

你可能感兴趣的:(Python,其他)