1. 程式人生 > 其它 >使用者驗證----JWT生成token,及token解析

使用者驗證----JWT生成token,及token解析

技術標籤:Web後端python

參考連結:https://www.cnblogs.com/lowmanisbusy/p/10930856.html

import time
import jwt

# payload
token_dict = {
			  'iat': time.time(),  # 時間戳
              'name': 'lowman'  # 自定義的引數
              }
              
"""payload 中一些固定引數名稱的意義, 同時可以在payload中自定義引數"""
# iss 【issuer】釋出者的url地址 # sub 【subject】該JWT所面向的使用者,用於處理特定應用,不是常用的欄位 # aud 【audience】接受者的url地址 # exp 【expiration】 該jwt銷燬的時間;unix時間戳 # nbf 【not before】 該jwt的使用時間不能早於該時間;unix時間戳 # iat 【issued at】 該jwt的釋出時間;unix 時間戳 # jti 【JWT ID】 該jwt的唯一ID編號 # headers headers = { 'alg': "HS256", # 宣告所使用的演算法
} """headers 中一些固定引數名稱的意義""" # jku: 傳送JWK的地址;最好用HTTPS來傳輸 # jwk: 就是之前說的JWK# kid: jwk的ID編號 # x5u: 指向一組X509公共證書的URL # x5c: X509證書鏈# x5t:X509證書的SHA-1指紋 # x5t#S256: X509證書的SHA-256指紋 # typ: 在原本未加密的JWT的基礎上增加了 JOSE 和 JOSE+ JSON。JOSE序列化後文會說及。適用於JOSE標頭的物件與此JWT混合的情況。 # crit: 字串陣列,包含宣告的名稱,用作實現定義的擴充套件,必須由 this->JWT的解析器處理。不常見。
# 呼叫jwt庫,生成json web token jwt_token = jwt.encode(token_dict, # payload, 有效載體 "zhananbudanchou1234678", # 進行加密簽名的金鑰 algorithm="HS256", # 指明簽名演算法方式, 預設也是HS256 headers=headers # json web token 資料結構包含兩部分, payload(有效載體), headers(標頭) ).decode('ascii') # python3 編碼後得到 bytes, 再進行解碼(指明解碼的格式), 得到一個str print(jwt_token) # 個人測試生成結果如下: # eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijk1MjcifQ.eyJpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbiJ9.GyQhOJK8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY data = None try: # 帶解析的jwt_token 金鑰 使用和加密時相同的演算法 data = jwt.decode(jwt_token, 'zhananbudanchou1234678', algorithms=['HS256']) print(data) except Exception as jwt_token_error: # 丟擲相應的異常:1.jwt 被篡改過; 1.演算法不正確; 3.過了有效期; 4.金鑰不相同 print(jwt_token_error) # 解析出來的就是pay_load 的相應內容如下: # {'iat': 1608519019.6443205, 'name': 'lowman'}