JWT编程语言之间的差异

2024-10-01 00:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用Python编写的API,还有一个用Ruby编写的API。我们需要它们在它们之间发送数据,并决定使用JWT作为身份验证方法。基本上在每一端生成一个令牌并确保它们匹配。现在我遇到了python和ruby之间哈希匹配的问题。给定以下代码:python(2.7)PyJWT==1.6.4

>>> import jwt
>>> jwt.encode({"someKey":123}, "secret", algorithm='HS256')

u'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lS2V5IjoxMjN9.DL8qyWMeqfMMLCTPN3RA9K08e-AkNW_ybPyywvrIIZ8'

在python版本之间,这一点似乎也会发生变化——在python3生成这个版本时运行它

b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcHBlbklkIjoxMjN9.YgFKZePJYMRDMgubCeZBy6WaFKiTA9C-TRnnZLFJC8E'

然后,当我在ruby中创建一个类似的“函数”时,我得到了一个不同的哈希值——在ruby的jwt版本之间也是如此(我测试了jwt-1.5.6和jwt-2.1.0)——下面是jwt-1.5.6的结果。在

^{pr2}$

该代码的输出是

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lS2V5IjoxMjN9.7Ch3o7IXmxqm79AcrTetXuZv6h3suyLD5_IgXdrRlNs

jwt 1.0版本:

eyJhbGciOiJIUzI1NiJ9.eyJzb21lS2V5IjoxMjN9.QkKm2IuvOz_D5ukIxOsjMYApzV2ZnjLE2HII3ZfP_hsWith

为什么这两个代码集的输出会产生两个不同的哈希值?在

编辑: 当我使用智威汤逊在

https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lS2V5IjoxMjN9.DL8qyWMeqfMMLCTPN3RA9K08e-AkNW_ybPyywvrIIZ8

我得到了和python相同的标记


Tags: 代码io版本apijwt发送数据rubyeyj0exaioijkv1qilcjhbgcioijiuzi1nij9
2条回答

所以我解决了这个问题,正如@jps提到的,Ruby代码没有头{“typ”:“JWT”},而python代码有。正如ruby的docs中提到的,jwt您可以设置头。这是在ruby端修复它的代码。在

token = JWT.encode(payload=payload, key=key, algorithm='HS256',header_fields={ typ: 'JWT' })

现在代币匹配了。顺便说一句,这些哈希,即使不同,也可以被同一个秘密解码——在auth中只需要额外的一个步骤,即重新检查ruby创建的哈希是否与传入的哈希匹配。在

没有必要在双方都创建令牌。 将JWT策略与pub priv key算法一起使用,比如RS256。有了它,您可以在一个API中签名JWT令牌,并能够使用另一个API中的公钥进行验证。在

相关问题 更多 >