JWT编程语言之间的差异

时间:2018-08-14 00:41:33

标签: python ruby jwt token

我有一个用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结果。

require "jwt"
someKey = 123
secret = "secret"
payload = {"someKey" => someKey}
token = JWT.encode payload, secret, 'HS256'
puts token

该代码的输出为

  

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lS2V5IjoxMjN9.7Ch3o7IXmxqm79AcrTetXuZv6h3suyLD5_IgXdrRlNs

使用jwt-2.1.0版本,我得到:

  

eyJhbGciOiJIUzI1NiJ9.eyJzb21lS2V5IjoxMjN9.QkKm2IuvOz_D5ukIxOsjMYApzV2ZnjLE2HII3ZfP_hsWith

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

编辑: 当我使用jwt.io

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

我获得与python相同的令牌

2 个答案:

答案 0 :(得分:0)

所以我解决了这个问题,正如@jps提到的那样,Ruby代码没有标头{“ typ”:“ JWT”}-python代码没有。如ruby jwt的文档中所述,您可以设置标题。这是将其固定在红宝石端的代码。

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

现在,令牌已匹配。顺便说一句,即使是不同的散列,也可以通过相同的秘密进行解码-auth中只有一个额外的步骤,即再次检查创建的哈希红宝石是否与传入的哈希匹配。

答案 1 :(得分:0)

无需在两侧都创建令牌。 将JWT策略与RS256之类的发布私钥算法一起使用。这样,您可以在一个API中签署JWT令牌,并能够在另一个API中使用公钥进行验证。