JWT
Json Web Token(JWT)
JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在兩個組織之間傳遞安全可靠的資訊。
官方定義:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties

JWT是一個有着簡單的統一表達形式的字元串:
頭部(Header)
頭部用于描述關于該JWT的最基本的資訊,例如其類型以及簽名所用的算法等。 JSON内容要經Base64 編碼生成字元串成為Header。
載荷(PayLoad)
payload的五個字段都是由JWT的标準所定義的。
- iss: 該JWT的簽發者
- sub: 該JWT所面向的使用者
- aud: 接收該JWT的一方
- exp(expires): 什麼時候過期,這裡是一個Unix時間戳
- iat(issued at): 在什麼時候簽發的
後面的資訊可以按需補充。 JSON内容要經Base64 編碼生成字元串成為PayLoad。
簽名(signature)
這個部分header與payload通過header中聲明的加密方式,使用密鑰secret進行加密,生成簽名。 JWS的主要目的是保證了資料在傳輸過程中不被修改,驗證資料的完整性。但由于僅采用Base64對消息内容編碼,是以不保證資料的不可洩露性。是以不适合用于傳輸敏感資料。
JWT的Python庫
獨立的JWT Python庫
- itsdangerous
- JSONWebSignatureSerializer
- TimedJSONWebSignatureSerializer (可設定有效期)
-
pyjwt
https://pyjwt.readthedocs.io/en/latest/
安裝
-
$ pip install pyjwt
用例
-
>>> import jwt >>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256') >>> encoded_jwt 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg' >>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256']) {'some': 'payload'}
示例代碼:産生與校驗
import jwt from flask import current_app
def generate_jwt(payload, expiry, secret=None):
""" 生成jwt
:param payload: dict 載荷
:param expiry: datetime 有效期
:param secret: 密鑰
:return: jwt
"""
_payload = {'exp': expiry}
_payload.update(payload)
if not secret:
secret = current_app.config['JWT_SECRET']
token = jwt.encode(_payload, secret, algorithm='HS256')
return token.decode() def verify_jwt(token, secret=None):
""" 檢驗jwt :param token: jwt :param secret: 密鑰 :return: dict: payload """
if not secret:
secret = current_app.config['JWT_SECRET']
try:
payload = jwt.decode(token, secret, algorithm=['HS256'])
except jwt.PyJWTError:
payload = None
return payload
多思考也是一種努力,做出正确的分析和選擇,因為我們的時間和精力都有限,是以把時間花在更有價值的地方。