python-jose,一個神奇的 Python 庫
在現代的 Web 應用程序開發中,身份驗證和授權是至關重要的一部分。JSON Web Token(JWT)是一種用于安全地傳輸信息的開放標準,它通常用于在用戶和服務器之間傳遞身份驗證和授權信息。
python-jose 是一個用于生成和驗證 JWT 的 Python 庫,它提供了簡單而強大的API,可以幫助開發人員輕松地處理JWT。
安裝
pip install python-jose
示例
以下是一個簡單的示例,演示了如何生成一個包含用戶ID信息的JWT:
from jose import jwt
payload = {'user_id': 110}
secret_key = 'secret'
algorithm = 'HS256'
token = jwt.encode(payload, secret_key, algorithm=algorithm)
print(token)
在這個示例中,我們使用jwt.encode()方法生成了一個JWT。我們傳遞了一個payload字典作為JWT的內容,并指定了一個密鑰作為簽名算法的一部分。生成的JWT可以被發送給客戶端,用于后續的身份驗證和授權
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMTB9.8xn1p_qCI-BvSa_IUUwtP_lAvZGGLNHAk_rOnCt9HtE
驗證JWT
使用 jwt.decode() 方法驗證 JWT,需指定密鑰和算法:
from jose import jwt
payload = {'user_id': 110}
secret_key = 'secret'
algorithm = 'HS256'
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMTB9.8xn1p_qCI-BvSa_IUUwtP_lAvZGGLNHAk_rOnCt9HtE'
decoded_payload = jwt.decode(token, secret_key, algorithms=[algorithm])
print(decoded_payload)
輸出:
{'user_id': 110}
-- 自定義JWT的有效期exp 是 JWT 的標準字段,用于標識 JWT 的過期時間。在解碼 JWT 時,jwt.decode() 默認會檢查 exp 字段,如果當前時間超過 exp 時間,會拋出 JWTError 異常 .
from jose import jwt
import time
payload = {
"key": "value",
"exp": time.time() + 10 # 設置有效期為 10 秒
}
secret_key = "your-secret-key"
algorithm = "HS256"
token = jwt.encode(payload, secret_key, algorithm=algorithm)
print(token)
輸出:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSIsImV4cCI6MTc0ODI2MDY2MS41MjE4NDI3fQ.__4zAK9NfJYSRo6vmRoYMs14Vr13tWC_g0KqdM0dmYo
驗證JWT:
from jose import jwt, JWTError
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSIsImV4cCI6MTc0ODI2MDYxMy43MTg0MjU1fQ.0hp6VLYjpG4KVsYsLLMGYW0Ur3-XkwzK6ojDx6KHqS4'
secret_key = "your-secret-key"
algorithms = ["HS256"]
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=algorithms)
print("Token is valid:", decoded_payload)
except JWTError as e:
print("Token is invalid:", e)
輸出:
Token is invalid: Signature has expired.
總結
- 全面的 JOSE 支持 :不僅支持 JWT,還支持 JWS、JWE、JWK、JWA 等 JOSE 標準。
- 多種加密與簽名算法 :支持 HS256、RS256 等對稱和非對稱加密算法,以及直接加密、對稱密鑰加密等多種模式。
- 豐富的驗證選項 :可驗證 JWT 的過期時間、簽發者、接收者等,確保 JWT 的安全性和可靠性。
- 支持 JWK :支持 JWK 格式的密鑰,方便密鑰的管理與分發。
- 多后端支持 :提供 cryptography、pycryptodome、native-python 等多種加密庫作為后端,滿足不同性能和依賴管理需求。