参考书籍:《FastAPI web入门、进阶与实践》

JWT是什么

JWT(JSON Web Token)是生成token的一种方法,而token本质是一个字符串。由Header、Payload和Signature组成。Header包含两个两个属性,alg:签名算法,type:token类型,如下:

{ "alg": "HS256", "typ": "JWT" }

Payload包含:注册声明​(标准字段):如 iss(签发者)、exp(过期时间)、sub(用户ID)等。公共声明​:自定义的非敏感信息(如用户名、角色)。私有声明​:服务端与客户端约定的自定义字段。这些字段是非必须的,一般要传的就是username、roles和exp。

例子:

{
  // 注册声明(标准字段)
  "iss": "auth_server",       // 签发者
  "sub": "user123",           // 用户ID
  "aud": "api.example.com",   // 接收方
  "exp": 1730332800,         // 过期时间(2025-07-28 00:00:00 UTC)
  "iat": 1730329200,          // 签发时间(2025-07-27 23:00:00 UTC)
  "nbf": 1730329200,          // 生效时间(同签发时间)

  // 公共声明(自定义非敏感信息)
  "username": "john_doe",
  "roles": ["user", "editor"],

  // 私有声明(服务端与客户端约定)
  "internal_id": "abc-xyz-789",
  "custom_flag": true
}

Signature是签证信息,用于验证信息没有被篡改。其中secret是服务端设置的一个字符串,组成结构如下:

Signature=HMACSMA256(base64UrlEncode(Header)+"."+base64UrlEncode(Payload),secret)

最后生成token字符串的格式如下:

token=base64UrlEncode(Header).base64UrlEncode(Payload).HS256(base64UrlEncode(Header).base64UrlEncode(Payload),secret)

JWT实践

python-jose库封装了JWT的实现,直接调用jwt.encode和jwt.decode便可以完成token的生成与解析。

首先,安装python-jose。

pip install python-jose

生成和解析token的代码如下:

from datetime import timedelta, datetime

from jose import jwt

SECRET ="qwertyuiopasdfghjklzxcvbnm"
ALGORITHM = "HS256"

class TokenUtils:
    @staticmethod
    def token_encode(data):
        return jwt.encode(data, SECRET, ALGORITHM)

    @staticmethod
    def token_decode(token):
        return jwt.decode(token, SECRET, algorithms=[ALGORITHM])

payload ={
    "username" : "zhangsan",
    "exp" : datetime.now() + timedelta(minutes=30)
}
token = TokenUtils.token_encode(payload)
print(token)
data = TokenUtils.token_decode(token)
print(data)

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐