使用pyjwt解码有效Token时出现签名验证失败错误
JWT解码触发
Signature verification failed错误的排查 使用pyjwt库的decode方法解码一个本应有效的JWT Token时,抛出Signature verification failed错误,报错栈如下:
File "/usr/local/lib/python3.10/site-packages/jwt/api_jwt.py", line 129, in decode decoded = self.decode_complete(jwt, key, algorithms, options, **kwargs) File "/usr/local/lib/python3.10/site-packages/jwt/api_jwt.py", line 100, in decode_complete decoded = api_jws.decode_complete( File "/usr/local/lib/python3.10/site-packages/jwt/api_jws.py", line 182, in decode_complete self._verify_signature(signing_input, header, signature, key, algorithms) File "/usr/local/lib/python3.10/site-packages/jwt/api_jws.py", line 269, in _verify_signature raise InvalidSignatureError("Signature verification failed") jwt.exceptions.InvalidSignatureError: Signature verification failed
相关代码(code.py)
token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imdvb2dsZV9wYW5lbCIsInNjb3BlcyI6e30sImV4cGlyZV90aW1lIjoxNjY2ODA4NzYxLjE5OTIzNH0.ywGoByIbXA_9DGFzMUWF7fpu1P-Ab8lWOv8FiEhIczw' class CustomAPI: def _check_expire(self, token: str, key: str) -> str: try: jwt.decode(token, key, algorithms=['HS256']) except jwt.ExpiredSignatureError: token = self._get_authorize_token() return token CustomAPI()._check_expire(token, settings.SECRET_KEY)
已尝试的解决方案
- 参考同类问题,使用
b64decode处理密钥参数:
_check_expire(token, b64decode(settings.SECRET_KEY))
但仍报错。
- 尝试使用随机字符串密钥
key = 'h^z13$qr_s_wd65@gnj7a=xs7t05$w7q8!x_8zsld#',问题依旧存在。
排查方向
- 确认签名密钥完全匹配:HS256签名要求解码密钥必须和生成Token时的密钥完全一致,包括大小写、特殊字符、前后空格。可以用本地JWT验证工具输入Token和对应密钥,先确认是否能通过验证,排除密钥不匹配的核心问题。
- 检查密钥编码格式:如果生成Token时用的是字节类型密钥,解码时也要保持一致的字节格式,不能直接传字符串类型。比如生成时用
b"your-secret",解码时就不能只传"your-secret"。 - 验证Token完整性:检查Token的Header、Payload、Signature三部分是否被篡改,比如Base64解码Payload后,确认字段内容和预期一致,没有被修改过。
- 排查pyjwt版本问题:不同版本的pyjwt签名验证逻辑可能有差异,尝试升级到最新稳定版或降级到2.8.0这类经过验证的版本,看是否能解决兼容性问题。
- 确认算法一致性:Token Header里明确指定了HS256算法,解码时必须严格指定
algorithms=['HS256'],不能混用RS256等其他算法。
内容的提问来源于stack exchange,提问作者Jekson
相关产品推荐
相关产品推荐

