So signieren Sie ein API-Token mit einem neuen Ablauf-Header
Mit folgendem Python-Code kann ein bestehender JWT decodiert, das exp-Claim (Ablaufzeitpunkt) neu gesetzt und der Token mit denselben Header-Informationen (inkl. kid und alg) erneut signiert werden. Ziel ist ein neuer, gültiger Token mit aktualisiertem Ablaufdatum:
from base64 import urlsafe_b64decode, b64encode from json import loads import datetime from jwt import encode, decode from typing import Dict, Any def pad_base64url(b64string: str) -> str: return b64string + '=' * (-len(b64string) % 4) def extract_header(jwt_token: str) -> Dict[str, Any]: header_b64 = jwt_token.split('.')[0] padded_header = pad_base64url(header_b64) header_json = urlsafe_b64decode(padded_header) return loads(header_json) def encode_secret(secret: str) -> bytes: return b64encode(secret.encode()) token: str = "eyJraWQiOiI1Zjc0RTZuME5pY…" secret: bytes = encode_secret("d4cHsO5QTC…") payload: Dict[str, Any] = decode(token, secret, algorithms=["HS512"], options={"verify_exp": False}) payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(hours=1) new_token: str = encode(payload, secret, headers=extract_header(token), algorithm="HS512") print(new_token)
Das ist besonders sinnvoll, wenn man kurzlebige Token verwenden möchte – etwa aus Sicherheitsgründen, um die Gültigkeitsdauer von Tokens bewusst zu begrenzen und so das Risiko bei Diebstahl oder Missbrauch zu minimieren.