You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用HMAC生成JWT令牌?签名创建及代码问题排查

解决JWT签名不匹配问题

你的代码里有三个关键问题导致签名和示例不符:

  1. 字典序列化错误:直接用str(header)把字典转成字符串,会生成带单引号的非标准JSON,而JWT要求严格的双引号JSON格式,必须用json.dumps序列化,还要指定separators=(',', ':')生成无空格的紧凑格式。
  2. Base64编码未去除填充:JWT使用的Base64URL编码需要去掉末尾的=填充字符,urlsafe_b64encode已经替换了+和/,但还要手动截断填充。
  3. 签名格式错误:HMAC生成的二进制摘要需要做Base64URL编码并去除填充,而不是直接转十六进制字符串。

修正后的代码如下:

import base64
import hmac
import json

def base64url_encode(data):
    # 序列化数据为标准JSON字节,再做Base64URL编码并去掉填充
    json_bytes = json.dumps(data, separators=(',', ':')).encode('utf-8')
    b64 = base64.urlsafe_b64encode(json_bytes)
    return b64.rstrip(b'=')

header = {"alg": "HS256", "typ": "JWT"}
payload = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}

encoded_header = base64url_encode(header)
encoded_payload = base64url_encode(payload)

# 生成签名:用密钥对header.payload的字节串做HMAC-SHA256,再Base64URL编码
secret = b'hi'
signature_input = encoded_header + b'.' + encoded_payload
signature = hmac.new(secret, signature_input, digestmod='sha256').digest()
encoded_signature = base64.urlsafe_b64encode(signature).rstrip(b'=')

# 拼接成完整JWT
jwt = encoded_header.decode('utf-8') + '.' + encoded_payload.decode('utf-8') + '.' + encoded_signature.decode('utf-8')

print("Encoded Header:", encoded_header.decode('utf-8'))
print("Encoded Payload:", encoded_payload.decode('utf-8'))
print("Encoded Signature:", encoded_signature.decode('utf-8'))
print("Full JWT:", jwt)

运行这段代码后,生成的JWT会和示例(密钥为hi)的结果完全一致,可直接验证有效性。

内容的提问来源于stack exchange,提问作者Pragyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:20:42