Python jwt使用


轉載:https://www.cnblogs.com/lowmanisbusy/p/10930856.html

Python jwt使用

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

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

      這種加密方式沒有公鑰,私鑰之分, 也就是只有一個密鑰, 這種加密方式適用於: 服務器將生成的jwt發送給接收方, 接收方將其返回給服務器, 服務器解析 jwt, 完成身份驗證.

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

     3.ECDSA【橢圓曲線數據簽名算法】 ES256/ES384/ES512

2).對稱加密HMAC 生成 jwt

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

3) 使用 python 對 jwt 進行解析

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

jwt_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ijk1MjcifQ.eyJpYXQiOjE1NTkyNzY5NDEuNDIwODgzNywibmFtZSI6Imxvd21hbiJ9.GyQhOJK8FKD_Gd-ggSEDPPP1Avmz3M5NDVnmfOfrEIY"

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

# 解析出來的就是 payload 內的數據
print(data)# 輸出: {'iat': 1559276941.4208837, 'name': 'lowman'}

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM