我有一個用Python編寫的API和另一個用Ruby編寫的API。我們需要它們在彼此之間發送數據,并已決定使用JWT作為身份驗證方法?;旧显谌我欢硕忌闪钆?,并確保它們匹配?,F在我在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 = 123secret = "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.iohttps://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lS2V5IjoxMjN9.DL8qyWMeqfMMLCTPN3RA9K08e-AkNW_ybPyywvr我得到與python相同的令牌
2 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
無需在雙方都創建令牌。結合使用JWT策略和pub私鑰算法RS256
。這樣,您可以在一個API中簽名JWT令牌,并能夠在另一個API中使用公鑰進行驗證。

慕虎7371278
TA貢獻1802條經驗 獲得超4個贊
所以我解決了這個問題,正如@jps提到的那樣,Ruby代碼沒有標頭{“ typ”:“ JWT”}-python代碼沒有。正如在ruby jwt的文檔中提到的,您可以設置標題。這是將其固定在紅寶石端的代碼。
token = JWT.encode(payload=payload, key=key, algorithm='HS256',header_fields={ typ: 'JWT' })
現在,令牌已匹配。順便說一句,即使是不同的哈希,也可以通過相同的秘密進行解碼-身份驗證中只有一個額外的步驟,即再次檢查創建的哈希紅寶石是否與傳入的哈希匹配。
添加回答
舉報
0/150
提交
取消