如何使用Python无需密钥解码JWT Token?
无密钥解码JWT Token的Python实现问题
我在某个JWT解码网站上无需密钥就能粘贴Token完成解码,但用Python的jwt库尝试无密钥解码时,会报错:
jwt.exceptions.InvalidSignatureError: Signature verification failed
我的报错代码如下:
import jwt token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXNzYWdlIjoidGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlIiwiaWF0IjoxNjc4MjE1ODY1fQ.jrNYdkoNau5H20CGXlHK5nASGxY7xLD8LF6zxt-thLY' decoded = jwt.decode(token, verify_signature=False, algorithms=['HS256']) print(decoded)
另外,这段代码能正常运行:
decoded = jwt.decode(token, 'secret', verify_signature=False, algorithms=['HS256'])
而这段代码同样报错:
decoded = jwt.decode(token, 'secret', verify=False, algorithms=['HS256'])
请问有没有像该网站那样无需密钥解码JWT Token的方法?
解决方案
首先明确:JWT的Payload部分本身是Base64URL编码的明文,网站无密钥解码就是直接解析了这部分,并未做签名验证。针对Python的PyJWT库,有两种正确的无密钥解码方式:
方式一:使用options参数关闭签名验证
PyJWT 2.x版本中,verify_signature参数需要放在options字典中传递,而非直接作为参数:
import jwt token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXNzYWdlIjoidGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlIiwiaWF0IjoxNjc4MjE1ODY1fQ.jrNYdkoNau5H20CGXlHK5nASGxY7xLD8LF6zxt-thLY' # 正确写法:将验证开关放入options decoded = jwt.decode(token, options={"verify_signature": False}, algorithms=["HS256"]) print(decoded)
方式二:手动解析Payload(绕开库的验证逻辑)
既然Payload是Base64URL编码格式,可直接拆分Token并解码:
import base64 import json token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXNzYWdlIjoidGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlIiwiaWF0IjoxNjc4MjE1ODY1fQ.jrNYdkoNau5H20CGXlHK5nASGxY7xLD8LF6zxt-thLY' # 拆分Token,取中间的Payload部分 payload_segment = token.split('.')[1] # Base64URL解码需补全等号 payload_segment += '=' * (-len(payload_segment) % 4) # 解码并转成字典 decoded_payload = json.loads(base64.urlsafe_b64decode(payload_segment)) print(decoded_payload)
代码报错原因说明
- 直接传
verify_signature=False作为参数:PyJWT 2.x已将该参数移至options,直接传递会被忽略,默认仍会验证签名,导致报错。 - 使用
verify=False:该参数在新版本中已被弃用,同样会触发签名验证逻辑,因此报错。
内容的提问来源于stack exchange,提问作者Brito
相关产品推荐
相关产品推荐

