天天看點

JWT驗證機制【Python版Flask或自己寫的後端可以用】【劉新宇】

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驗證機制【Python版Flask或自己寫的後端可以用】【劉新宇】

JWT是一個有着簡單的統一表達形式的字元串:

JWT驗證機制【Python版Flask或自己寫的後端可以用】【劉新宇】
頭部(Header)

頭部用于描述關于該JWT的最基本的資訊,例如其類型以及簽名所用的算法等。 JSON内容要經Base64 編碼生成字元串成為Header。

載荷(PayLoad)

payload的五個字段都是由JWT的标準所定義的。

  1. iss: 該JWT的簽發者
  2. sub: 該JWT所面向的使用者
  3. aud: 接收該JWT的一方
  4. exp(expires): 什麼時候過期,這裡是一個Unix時間戳
  5. 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           

多思考也是一種努力,做出正确的分析和選擇,因為我們的時間和精力都有限,是以把時間花在更有價值的地方。