使用者驗證----JWT生成token,及token解析
阿新 • • 發佈:2020-12-22
參考連結: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'}