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
相关产品推荐
相关产品推荐

