Python 编程语言之间的JWT差异

Python 编程语言之间的JWT差异,python,ruby,jwt,token,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'EYJHBGCO

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

>>> import jwt
>>> jwt.encode({"someKey":123}, "secret", algorithm='HS256')
u'EYJHBGCOIJIUZI1NIISINR5CCI6IKPXVCJ9.eyJzb21lS2V5IjoxMjN9.DL8QYWMEQFMLCTPN3RA9K08E-AkNW_YBYWVRIIZ8'

这似乎在python版本之间也会发生变化——以python3生成的方式运行它

b'EYJ0EXAIIOIJKV1QILCHbGCIOIJIUZI1NIJ9.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
该代码的输出是

EYJ0EXAIIOIJKV1QILCHbGCIOIJIUZI1NIJ9.eyJzb21lS2V5IjoxMjN9.7CH3O7IXMXQM79ACRTEXUZV6H3SUYLD5

对于jwt-2.1.0版,我得到:

EYJHBGCOIJIUZI1NIJ9.eyJzb21lS2V5IjoxMjN9.QkKm2IuvOzD5ukIxOsjMYApzV2ZnjLE2HII3ZfP

为什么这两个代码集的输出会产生两个不同的散列

编辑: 当我使用jwt.io时


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

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

现在,这些标记将匹配。顺便说一句,即使散列不同,也可以用相同的秘密进行解码-auth中只需额外的一步,即仔细检查ruby创建的散列是否与传入的散列匹配。

无需在两侧创建令牌。
将JWT策略与pub-priv-key算法一起使用,如
RS256
。这样,您就可以在一个API中对JWT令牌进行签名,并能够在另一个API中使用公钥进行验证。

JWT 1.5.6和JWT 2.1.0是否使用相同的哈希函数?您是否对相同的数据进行散列(python中的dict不是JSON)?有趣的问题,但从设计的角度来看,您可能不应该这样做:)您只能在python端使用dict(jwt.encode只接受dict)-但对于Ruby端,函数接受dict或JSON字符串-两者都不匹配。虽然代码看得不多,但python在Python3中默认切换为Unicode字符串,而Python2却不是这样。这会导致不同的输出吗?使用Python2将
u
添加到字符串中,然后查看输出是否匹配。如果检查JWT.io上的所有JWT,可以看到头字段的不同顺序(但值相同),只有第二个ruby示例缺少
typ
头。有效负载是
“someKey”:“123”
,但在python3中它改为
“appenId”:“123”
。难怪结果不同。JWT的想法不是产生相同的令牌来比较它们,而是要有一个签名,使您能够验证令牌本身。我完全同意您的看法。我没有设计auth方法,修改它会破坏很多部分。