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

PyJWT未触发ExpiredSignatureError异常问题咨询

JWT过期验证未抛出ExpiredSignatureError的问题排查与解决

问题原因

你创建JWT时,iat字段使用了带UTC时区的时间,但exp字段用的是不带时区的datetime.now()。PyJWT验证exp时默认以UTC时间为基准,而无时区的datetime会被解析为本地时间,和UTC时间存在时差,导致即使等待3秒,实际验证时exp对应的UTC时间可能仍未过期,因此不会抛出ExpiredSignatureError。

修复方案

将exp字段的时间也设置为带UTC时区的时间,确保和iat时区一致:

修改后的JWT创建代码

jwt.encode(
    {'sub':"abc", 
     "iat": datetime.now(tz=timezone.utc), 
     "exp": datetime.now(tz=timezone.utc) + timedelta(seconds=1)}, 
    JWT_KEY, 
    algorithm="HS256"
)

验证代码保持不变

try:
    return jwt.decode(token, JWT_KEY, algorithms=["HS256"])
except jwt.ExpiredSignatureError:
    raise Exception("JWT expired")

补充说明

  • PyJWT要求exp、iat等时间声明必须是带时区的UTC时间,或是Unix时间戳(整数格式)。使用无时区datetime会导致时间对比偏差。
  • 也可以直接传入Unix时间戳规避时区问题,示例如下:
current_utc = datetime.now(tz=timezone.utc)
jwt.encode(
    {'sub':"abc", 
     "iat": int(current_utc.timestamp()), 
     "exp": int(current_utc.timestamp()) + 1}, 
    JWT_KEY, 
    algorithm="HS256"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:00