1 下載安裝PyJWT。我這裏使用的版本是1.7.1,環境Python3.6.3
pip install PyJWT==1.7.1
2 導入生成JWT
import jwt
# 設置payload
token_dict = {
'iat': time.time(),
'name': 'xxx' # 可加入自定義的參數
}
"""
payload一些固定參數的介紹,如上面的‘iat’.
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的解析器處理。不常見。
"""
# 生成json web token
# 調用jwt庫,生成json web token
jwt_token = jwt.encode(
token_dict, # payload, 有效載體
"abcdefg123456", # 進行加密簽名的密鑰
algorithm="HS256", # 指明簽名算法方式, 默認也是HS256
headers=headers # json web token 數據結構包含兩部分, payload(有效載體), headers(標頭)
).decode('utf-8') # python3 編碼後得到 bytes, 再進行解碼(指明解碼的格式), 得到一個str
3 進行JWT的認證
# 生成json web token 後進行認證
try:
#需要解析的 jwt密鑰使用和加密時相同的算法
data = jwt.decode(
token, # 生成的jwt
"abcdefg123456", # 加密時的祕鑰
algorithms=['HS256']) # 加密時使用的算法
except Exception as e:
# 如果 jwt 被篡改過; 或者算法不正確; 如果設置有效時間, 過了有效期; 或者密鑰不相同; 都會拋出相應的異常
print(e)
# 最後解析出來的數據就是先前加密時放入payload中的內容
data = {
'iat': time.time(),
'name': 'xxx'
}