PyJWT 引发签名验证失败
Posted
技术标签:
【中文标题】PyJWT 引发签名验证失败【英文标题】:PyJWT raises Signature verification failed 【发布时间】:2019-02-08 23:20:45 【问题描述】:我正在尝试验证由 ThingsBoard 发布的 JWT。
但验证失败,Signature verification failed
我的测试代码如下。
def test_jwt_decoding():
jwt_options =
'verify_signature': True,
'verify_exp': True,
'verify_nbf': False,
'verify_iat': True,
'verify_aud': False
token = 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbkB0LW1vbmV0LmNvbSIsInNjb3BlcyI6WyJURU5BTlRfQURNSU4iXSwidXNlcklkIjoiODNiYmEzNDAtMDI3ZC0xMWU4LWI4ZmEtYWY1YjU0OTEyMDA0IiwiZmlyc3ROYW1lIjoi7ISx64Ko7IucIiwibGFzdE5hbWUiOiLqtIDrpqzsnpAiLCJlbmFibGVkIjp0cnVlLCJpc1B1YmxpYyI6ZmFsc2UsInRlbmFudElkIjoiMzkwMTNjNzAtMDI3ZC0xMWU4LWI4ZmEtYWY1YjU0OTEyMDA0IiwiY3VzdG9tZXJJZCI6IjEzODE0MDAwLTFkZDItMTFiMi04MDgwLTgwODA4MDgwODA4MCIsImlzcyI6InRoaW5nc2JvYXJkLmlvIiwiaWF0IjoxNTM1OTU1NDE2LCJleHAiOjM2NzU5NTU0MTZ9.N1Ms0LA7WtOel1pg6lTMRNDJosY3qfR6Q4SVuAUwmDPmTj4uYnKU0B-9Wdlqmg4HQRUXa23edOTU-TnAxfBoyg'
try:
jwt.decode(
token,
'thingsboardDefaultSigningKey',
algorithms=['HS512'],
options=jwt_options
)
assert True
except Exception as err:
print(str(err))
assert False
我检查了签名在 jwt.io 上得到验证 唯一的区别是在 jwt.io 上 secret base64 编码
我在猜测 secret base64 编码造成了这种差异。 我该怎么办?
【问题讨论】:
【参考方案1】:jwt.decode(..)
期望键值是文本字符串中的实际秘密,没有编码。看来您的令牌是用一个预期秘密是 base64 编码的例程编码的。幸运的是,您的秘密“thingsboardDefaultSigningKey”恰好正确解码为 base64。
将您的呼叫更改为:
jwt.decode(
token,
b64decode('thingsboardDefaultSigningKey'),
algorithms=['HS512'],
options=jwt_options
)
然后它将毫无例外地解码。
【讨论】:
你为我节省了很多时间。谢谢。以上是关于PyJWT 引发签名验证失败的主要内容,如果未能解决你的问题,请参考以下文章
JwtSecurityTokenHandler ValidateToken:“签名验证失败。没有提供安全密钥来验证签名”