什么是JWT
Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准((RFC 7519).該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
Python JWT中的使用
#!./usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2020/9/30
# Author: Jimmy
from datetime import timedelta, datetime
import jose
from jose import jwt
SECRET_KEY: str = "yo5mCDHCnhOtyI60GPmuolPVYvX9pQzQQ1kdMwWMqcM"
# 60 minutes * 24 hours * 8 days = 8 days
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8
ALGORITHM = "HS256"
def create_access_token(subject, expires_delta: timedelta = None) -> str:
"""
生成一個 jwt token
:param subject: token里存放的信息, 一般存放用戶id
:param expires_delta: 過期時間,單位:分鍾
:return:
"""
now = datetime.utcnow()
if expires_delta:
expire = now + expires_delta
else:
expire = now + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
'''
payload參數說明
exp: 過期時間
iat: 發布時間
iss: 發布者
sub: 面向的用戶
'''
payload = {"exp": expire, "iat": now, "iss": "Jimmy", "sub": str(subject)}
encoded_jwt = jose.jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
def token_to_sub(token_str: str):
"""
解碼token
jwt.decode 的異常:
token過期:jose.exceptions.ExpiredSignatureError
token無效:jose.exceptions.JWTError
所有異常:jose.jwt.JWTError
:param token_str:
:return:
"""
try:
payload = jwt.decode(token_str, SECRET_KEY, algorithms=[ALGORITHM])
return payload.get('sub')
except jose.exceptions.ExpiredSignatureError:
print('token已過期')
except jose.exceptions.JWTError:
print('token無效')
if __name__ == '__main__':
# 1. 生成一個 jwt token
user_id = 66
token = create_access_token(user_id, timedelta(minutes=1))
print(f"生成的token:{token}")
# 2. 獲取 jwt token 里的用戶id
ret = token_to_sub(token)
print(f"從token中獲取到的用戶id為:{ret}")