PyJWT引发签名验证失败

时间:2018-09-04 01:09:06

标签: python jwt thingsboard pyjwt

我正在尝试验证由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上秘密base64编码

enter image description here

我在猜测秘密的base64编码造成了这种差异。
我该怎么办?

1 个答案:

答案 0 :(得分:2)

jwt.decode(..)期望键值是文本字符串中的实际机密,不进行编码。似乎您的令牌已使用例程进行了编码,该例程预期该机密已通过base64编码。真幸运,您的秘密“ thingsboardDefaultSigningKey”恰好可以正确解码为base64。

将通话更改为: jwt.decode( token, b64decode('thingsboardDefaultSigningKey'), algorithms=['HS512'], options=jwt_options )

然后它将毫无例外地进行解码。