使用python實現(xiàn)后臺系統(tǒng)的JWT

  1. 關(guān)于 jwt 的原理及概念可以自行在網(wǎng)絡(luò)上搜索了解一下,這里推薦一篇寫的比較好的博客

深入了解Json Web Token之概念篇

另附 JWT 的官方文檔: https://jwt.io/introduction/

  1. python 對于 jwt 的實現(xiàn), 目前已經(jīng)存在了一些第三方的庫, 相信學(xué)習(xí)過 python 的程序猿都知道 itsdangerous 這個庫了, 它的底層原理就是基于 jwt 進行實現(xiàn)的

  2. python實現(xiàn)生成 json web token

環(huán)境: python3.6.7

依賴包: jwt, time

1)JWT 的簽名算法有三種旗笔。

1.對稱加密HMAC【哈希消息驗證碼】 HS256/HS384/HS512

這種加密方式?jīng)]有公鑰,私鑰之分, 也就是只有一個密鑰, 這種加密方式適用于: 服務(wù)器將生成的jwt發(fā)送給接收方, 接收方將其返回給服務(wù)器, 服務(wù)器解析 jwt, 完成身份驗證.

2.非對稱加密RSASSA【RSA簽名算法】RS256/RS384/RS512

3.ECDSA【橢圓曲線數(shù)據(jù)簽名算法】 ES256/ES384/ES512

2).對稱加密HMAC 生成 jwt

import time
import jwt

# payload
token_dict = {
    'iat':time.time(),  # 時間戳
    'name':'George'
}
"""payload 中一些固定參數(shù)名稱的意義, 同時可以在payload中自定義參數(shù)"""
# iss  【issuer】發(fā)布者的url地址
# sub 【subject】該JWT所面向的用戶纱昧,用于處理特定應(yīng)用桶雀,不是常用的字段
# aud 【audience】接受者的url地址
# exp 【expiration】 該jwt銷毀的時間槐脏;unix時間戳
# nbf  【not before】 該jwt的使用時間不能早于該時間衷旅;unix時間戳
# iat   【issued at】 該jwt的發(fā)布時間澜驮;unix 時間戳
# jti    【JWT ID】 該jwt的唯一ID編號

# headers
headers = {
    'alg': "HS256",  # 所使用的加密算法方式
    'kid': "8888",  # key_id
}

"""headers 中一些固定參數(shù)名稱的意義"""
# jku: 發(fā)送JWK的地址漱逸;最好用HTTPS來傳輸
# jwk: 就是之前說的JWK
# kid: jwk的ID編號
# x5u: 指向一組X509公共證書的URL
# x5c: X509證書鏈
# x5t:X509證書的SHA-1指紋
# x5t#S256: X509證書的SHA-256指紋
# typ: 在原本未加密的JWT的基礎(chǔ)上增加了 JOSE 和 JOSE+ JSON纳决。JOSE序列化后文會說及释树。適用于JOSE標(biāo)頭的對象與此JWT混合的情況肠槽。
# crit: 字符串?dāng)?shù)組,包含聲明的名稱奢啥,用作實現(xiàn)定義的擴展秸仙,必須由 this->JWT的解析器處理。不常見桩盲。

# 調(diào)用jwt庫,生成json web token
jwt_token = jwt.encode(token_dict,  # payload, 有效載體
                       "George8888",  # 進行加密簽名的密鑰
                       algorithm="HS256",  # 指明簽名算法方式, 默認也是HS256
                       headers=headers  # json web token 數(shù)據(jù)結(jié)構(gòu)包含兩部分, payload(有效載體), headers(標(biāo)頭)
                       ).decode('ascii')  # python3 編碼后得到 bytes, 再進行解碼(指明解碼的格式), 得到一個str

print(jwt_token)

# 個人測試生成結(jié)果如下: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijg4ODgifQ.eyJpYXQiOjE1NjQwMjU0MTcuNTc1NDQ3LCJuYW1lIjoiR2VvcmdlIn0.ScPOppgmV3wM-o8ohVL4u2mUGPql5-cwaOO8ZvLn4jM
  1. 使用 python 對 jwt 進行解析
import jwt

# 將上面生成的 jwt 進行解析認證

jwt_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijg4ODgifQ.eyJpYXQiOjE1NjQwMjU0MTcuNTc1NDQ3LCJuYW1lIjoiR2VvcmdlIn0.ScPOppgmV3wM-o8ohVL4u2mUGPql5-cwaOO8ZvLn4jM"

data = None
try:# 需要解析的 jwt 密鑰   使用和加密時相同的算法
    data = jwt.decode(jwt_token, "George8888", algorithms=['HS256'])
except Exception as e:# 如果 jwt 被篡改過; 或者算法不正確; 如果設(shè)置有效時間, 過了有效期; 或者密鑰不相同; 都會拋出相應(yīng)的異常
    print(e)

# 解析出來的就是 payload 內(nèi)的數(shù)據(jù)
print(data)

# 輸出: {'iat': 1564025417.575447, 'name': 'George'}

4)如果是使用私鑰公鑰進行加密解密的方式(由請求方使用私鑰進行加密生成 jwt, 接收方使用公鑰解密), 只需要將相應(yīng)參數(shù)更換成私鑰(將私鑰證書讀取出來, 賦值給相應(yīng)參數(shù)即可), 并使用雙方約定好的的簽名算法

  1. python 對于 jwt 的實現(xiàn), 已經(jīng)有了 itsdangerous 這個庫做了很好的支撐, 使用起來還是很方便的, 大家可以自行去了解一下.

itsdangerous 官方文檔: https://itsdangerous.readthedocs.io/en/1.1.x/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寂纪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赌结,更是在濱河造成了極大的恐慌捞蛋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬姚,死亡現(xiàn)場離奇詭異襟交,居然都是意外死亡,警方通過查閱死者的電腦和手機伤靠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門捣域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啼染,“玉大人,你說我怎么就攤上這事焕梅〖6欤” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵贞言,是天一觀的道長斜棚。 經(jīng)常有香客問我,道長该窗,這世上最難降的妖魔是什么弟蚀? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮酗失,結(jié)果婚禮上义钉,老公的妹妹穿的比我還像新娘。我一直安慰自己规肴,他們只是感情好捶闸,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拖刃,像睡著了一般删壮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兑牡,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天央碟,我揣著相機與錄音,去河邊找鬼均函。 笑死硬耍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的边酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼狸窘,長吁一口氣:“原來是場噩夢啊……” “哼墩朦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翻擒,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氓涣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陋气,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劳吠,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年巩趁,在試婚紗的時候發(fā)現(xiàn)自己被綠了痒玩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蠢古,靈堂內(nèi)的尸體忽然破棺而出奴曙,到底是詐尸還是另有隱情,我是刑警寧澤草讶,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布洽糟,位于F島的核電站,受9級特大地震影響堕战,放射性物質(zhì)發(fā)生泄漏坤溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一嘱丢、第九天 我趴在偏房一處隱蔽的房頂上張望薪介。 院中可真熱鬧,春花似錦屿讽、人聲如沸昭灵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烂完。三九已至,卻和暖如春诵棵,著一層夾襖步出監(jiān)牢的瞬間抠蚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工履澳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘶窄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓距贷,卻偏偏與公主長得像柄冲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忠蝗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容