JWT Decoder Python — PyJWT से JWT डीकोड करने की गाइड
मुफ़्त JWT Decoder को सीधे अपने ब्राउज़र में उपयोग करें — इंस्टॉलेशन की ज़रूरत नहीं।
JWT Decoder ऑनलाइन आज़माएं →टोकन-आधारित प्रमाणीकरण उपयोग करने वाला हर API किसी न किसी बिंदु पर आपको एक JWT देता है, और उसके अंदर क्या है यह जानना विकास के दौरान बार-बार आने वाला कार्य है। Python में JWT डीकोडर उस random-सी base64 string को एक readable claims dictionary में बदलता है जिसके साथ आप actually काम कर सकते हैं। आपको जो PyPI पैकेज चाहिए वह है PyJWT — इंस्टॉल करें pip install PyJWT से, लेकिन आयात करें import jwt के रूप में। यह guide jwt.decode() को पूर्ण हस्ताक्षर सत्यापन के साथ, बिना गोपनीय कुंजी के त्वरित निरीक्षण के लिए डीकोडिंग, बिना किसी लाइब्रेरी के मैन्युअल base64 डीकोडिंग, RS256 सार्वजनिक कुंजी सत्यापन, और उत्पादन प्रमाणीकरण प्रणालियों में आने वाली सामान्य गलतियाँ — सब कुछ cover करती है। एक बार की जल्दी जाँच के लिए, ऑनलाइन JWT Decoder बिना किसी कोड के यह तुरंत करता है। सभी उदाहरण Python 3.10+ और PyJWT 2.x के लिए हैं।
- ✓pip install PyJWT करें, फिर import jwt — पैकेज का नाम और आयात नाम अलग हैं, जो लगभग सभी को भ्रमित करता है।
- ✓jwt.decode(token, key, algorithms=["HS256"]) क्लेम के साथ एक सामान्य dict लौटाता है। algorithms हमेशा स्पष्ट रूप से पास करें।
- ✓सत्यापन के बिना क्लेम निरीक्षण करने के लिए: jwt.decode(token, options={"verify_signature": False}, algorithms=["HS256"])।
- ✓RSA/EC टोकन के लिए: pip install PyJWT cryptography — असममित एल्गोरिदम के लिए cryptography बैकएंड आवश्यक है।
- ✓मैन्युअल डीकोडिंग (base64 + json) बिना किसी लाइब्रेरी के काम करती है लेकिन हस्ताक्षर और समाप्ति सत्यापन नहीं करती।
JWT डीकोडिंग क्या है?
JSON Web Token तीन base64url-एन्कोडेड खंडों का बिंदुओं से विभाजित समूह है: एक हेडर (एल्गोरिदम और टोकन प्रकार), एक payload (क्लेम — उपयोगकर्ता ID, भूमिकाएँ, समाप्ति समय), और एक हस्ताक्षर। JWT डीकोड करने का अर्थ है हेडर और payload खंड निकालना, उन्हें base64url-डीकोड करना, और परिणामी JSON को क्लेम के dict में पार्स करना।
हेडर बताता है कि टोकन पर हस्ताक्षर करने के लिए कौन सा एल्गोरिदम उपयोग किया गया और कभी-कभी सही सत्यापन कुंजी खोजने के लिए kid (कुंजी ID) भी शामिल होता है। payload में वास्तविक डेटा होता है: टोकन किसे जारी किया गया (sub), यह कब समाप्त होता है (exp), यह किस सेवा के लिए है (aud), और आपके अनुप्रयोग के कोई भी कस्टम क्लेम। हस्ताक्षर खंड सिद्ध करता है कि टोकन के साथ छेड़छाड़ नहीं हुई, लेकिन इसे सत्यापित करने के लिए आपको गोपनीय कुंजी या सार्वजनिक कुंजी चाहिए। Decoding और verification दो अलग-अलग काम हैं। आप हस्ताक्षर सत्यापित किए बिना payload डीकोड कर सकते हैं (डीबगिंग के लिए उपयोगी), लेकिन authorization decisions के लिए unverified claims पर कभी भरोसा न करें।
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxMTgxNTYwMH0.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
{
"sub": "usr_8f2a",
"role": "admin",
"exp": 1711815600
}jwt.decode() — PyJWT से डीकोड और सत्यापन
jwt.decode() PyJWT लाइब्रेरी का प्राथमिक फ़ंक्शन है। यह एन्कोडेड टोकन स्ट्रिंग, गोपनीय कुंजी (HMAC एल्गोरिदम के लिए) या सार्वजनिक कुंजी (RSA/EC के लिए), और एक अनिवार्य algorithms सूची लेता है। यह फ़ंक्शन हस्ताक्षर सत्यापित करता है, मानक क्लेम जैसे exp और nbf जाँचता है, और payload को Python dict के रूप में लौटाता है। यदि कुछ भी विफल होता है — गलत हस्ताक्षर, समाप्त टोकन, गलत एल्गोरिदम — तो यह एक विशिष्ट अपवाद उठाता है।
न्यूनतम कार्यशील उदाहरण
import jwt
# A shared secret between the issuer and this service
SECRET_KEY = "k8s-webhook-signing-secret-2026"
# Encode a token first (simulating what an auth server would issue)
token = jwt.encode(
{"sub": "usr_8f2a", "role": "admin", "team": "platform"},
SECRET_KEY,
algorithm="HS256"
)
print(token)
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3Jf...
# Decode and verify the token
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
print(payload)
# {'sub': 'usr_8f2a', 'role': 'admin', 'team': 'platform'}
print(payload["role"])
# adminalgorithms पैरामीटर एक सूची है, एकल स्ट्रिंग नहीं, और यह PyJWT 2.x में अनिवार्य है। यह एक सुरक्षा विशेषता है: इसके बिना, एक आक्रमणकारी हेडर में alg: none के साथ टोकन बना सकता है और सत्यापन को पूरी तरह दरकिनार कर सकता है। हमेशा स्पष्ट रूप से बताएँ कि आपका अनुप्रयोग कौन से एल्गोरिदम स्वीकार करता है। यदि आप केवल HS256 टोकन जारी करते हैं, तो सूची ["HS256"] होनी चाहिए — न कि ["HS256", "RS256", "none"]। सूची संक्षिप्त रखने से आक्रमण का दायरा कम होता है।
एक बात जो शुरुआत में मुझे भ्रमित करती थी: PyJWT 2.x ने jwt.encode() को बाइट्स की बजाय स्ट्रिंग लौटाने के लिए बदल दिया। यदि आप पुराने Stack Overflow उत्तर पढ़ रहे हैं जो एन्कोडेड टोकन पर .decode("utf-8") कहते हैं, तो वह कोड PyJWT 1.x के दौर का है और संस्करण 2.x पर AttributeError देगा। टोकन पहले से ही एक स्ट्रिंग है — इसे सीधे उपयोग करें।
समाप्ति के साथ पूर्ण राउंड-ट्रिप
import jwt
from datetime import datetime, timedelta, timezone
SECRET_KEY = "webhook-processor-secret"
# Create a token that expires in 1 hour
payload = {
"sub": "svc_payment_processor",
"iss": "auth.internal.example.com",
"aud": "https://api.example.com",
"exp": datetime.now(timezone.utc) + timedelta(hours=1),
"permissions": ["orders:read", "refunds:create"],
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
# Later, when the token arrives in a request header:
try:
decoded = jwt.decode(
token,
SECRET_KEY,
algorithms=["HS256"],
audience="https://api.example.com",
issuer="auth.internal.example.com",
)
print(f"Service: {decoded['sub']}")
print(f"Permissions: {decoded['permissions']}")
except jwt.ExpiredSignatureError:
print("Token expired — request re-authentication")
except jwt.InvalidAudienceError:
print("Token not intended for this API")
except jwt.InvalidIssuerError:
print("Token issued by unknown authority")datetime ऑब्जेक्ट को स्वचालित रूप से Unix टाइमस्टैम्प में बदलता है। डीकोडिंग के दौरान, exp, iat, और nbf क्लेम datetime ऑब्जेक्ट नहीं, बल्कि पूर्णांक के रूप में वापस आते हैं। आपको इन्हें स्वयं datetime.fromtimestamp(payload["exp"], tz=timezone.utc) से रूपांतरित करना होगा।हस्ताक्षर सत्यापन के बिना JWT डीकोड करें
कभी-कभी आपको टोकन सत्यापित करने से पहले क्लेम पढ़ने की आवश्यकता होती है। एक सामान्य परिदृश्य: टोकन हेडर में kid (कुंजी ID) फ़ील्ड है, और सत्यापन से पहले आपको JWKS एंडपॉइंट से मिलान करने वाली सार्वजनिक कुंजी लानी होगी। PyJWT इसे verify_signature: False विकल्प से समर्थित करता है। आप अभी भी algorithms सूची पास करते हैं, लेकिन key आर्गुमेंट अनदेखा किया जाता है।
import jwt
token = (
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InNpZy0xNzI2In0"
".eyJzdWIiOiJ1c3JfM2M3ZiIsInNjb3BlIjoicmVhZDpvcmRlcnMiLCJpc3MiOiJhdXRoLmV4YW1wbGUuY29tIn0"
".signature_placeholder"
)
# Step 1: Read claims without verification to get routing info
unverified = jwt.decode(
token,
options={"verify_signature": False},
algorithms=["RS256"]
)
print(unverified)
# {'sub': 'usr_3c7f', 'scope': 'read:orders', 'iss': 'auth.example.com'}
# Step 2: Read the header to find which key to use
header = jwt.get_unverified_header(token)
print(header)
# {'alg': 'RS256', 'typ': 'JWT', 'kid': 'sig-1726'}
# Now use header['kid'] to fetch the correct public key from your JWKS endpointयहाँ एक सूक्ष्म अंतर है। jwt.get_unverified_header() केवल हेडर — पहला खंड — पढ़ता है। jwt.decode() कॉल verify_signature: False के साथ payload (दूसरा खंड) पढ़ता है। इन दोनों से आप बिना किसी कुंजी के टोकन से सब कुछ निकाल सकते हैं। हस्ताक्षर सत्यापन बंद होने पर भी PyJWT यह सत्यापित करता है कि टोकन में सही संरचना है (तीन बिंदु-विभाजित खंड, वैध base64, वैध JSON)। यदि टोकन संरचनात्मक रूप से अनुचित है, तो यह DecodeError उठाता है, चाहे आप जो भी विकल्प पास करें।
jwt.decode() पैरामीटर संदर्भ
पूर्ण हस्ताक्षर है jwt.decode(jwt, key, algorithms, options, audience, issuer, leeway, require)।algorithms के बाद सभी पैरामीटर केवल कीवर्ड-आधारित हैं।
options dict PyJWT द्वारा किए जाने वाले सत्यापनों पर सूक्ष्म नियंत्रण देता है। कुंजियाँ अलग-अलग जाँचों से मेल खाती हैं: verify_signature, verify_exp, verify_nbf, verify_iss, verify_aud, और verify_iat। जब तक आप स्पष्ट रूप से इन्हें False नहीं करते, सभी डिफ़ॉल्ट रूप से True होते हैं। उत्पादन में, इन सभी को उनके डिफ़ॉल्ट पर छोड़ें। मैं अलग-अलग जाँच केवल विकास के दौरान अक्षम करता हूँ जब पुराने परीक्षण टोकन के साथ काम कर रहा होता हूँ और समाप्ति को अस्थायी रूप से दरकिनार करना होता है।
import jwt
# Require specific claims to be present — raises MissingRequiredClaimError if absent
payload = jwt.decode(
token,
SECRET_KEY,
algorithms=["HS256"],
options={"require": ["exp", "iss", "sub"]},
issuer="auth.internal.example.com",
)
# During development only: skip expiry to test with old tokens
dev_payload = jwt.decode(
token,
SECRET_KEY,
algorithms=["HS256"],
options={"verify_exp": False}, # DO NOT use in production
)base64 और json से मैन्युअल JWT डीकोडिंग
आप केवल Python मानक लाइब्रेरी का उपयोग करके JWT payload डीकोड कर सकते हैं — कोई pip install आवश्यक नहीं। यह कई स्थितियों में वास्तव में उपयोगी है: डीबगिंग स्क्रिप्ट जहाँ निर्भरता जोड़ना अनावश्यक है, प्रतिबंधित CI परिवेश जहाँ केवल मानक लाइब्रेरी उपलब्ध है, AWS Lambda फ़ंक्शन जहाँ कोल्ड स्टार्ट समय कम रखना चाहते हैं, या बस यह समझना कि JWT वास्तव में क्या है। प्रक्रिया सीधी है: बिंदुओं पर विभाजित करें, वांछित खंड लें, base64 पैडिंग जोड़ें, डीकोड करें, और JSON पार्स करें।
base64 और json दोनों मॉड्यूल Python मानक लाइब्रेरी में हैं, इसलिए यह दृष्टिकोण Python 3.6 से किसी भी Python इंस्टॉलेशन पर काम करता है। नीचे दिए गए फ़ंक्शन हेडर (पहला खंड) और payload (दूसरा खंड) को अलग-अलग संभालते हैं:
import base64
import json
def decode_jwt_payload(token: str) -> dict:
"""Decode the JWT payload without signature verification.
Works with any JWT — HS256, RS256, ES256, etc.
"""
parts = token.split(".")
if len(parts) != 3:
raise ValueError(f"Expected 3 JWT segments, got {len(parts)}")
payload_b64 = parts[1]
# base64url uses - and _ instead of + and /
# Python's urlsafe_b64decode handles this, but needs padding
payload_b64 += "=" * (-len(payload_b64) % 4)
payload_bytes = base64.urlsafe_b64decode(payload_b64)
return json.loads(payload_bytes)
def decode_jwt_header(token: str) -> dict:
"""Decode the JWT header (algorithm, key ID, type)."""
header_b64 = token.split(".")[0]
header_b64 += "=" * (-len(header_b64) % 4)
return json.loads(base64.urlsafe_b64decode(header_b64))
# Example usage
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxMTgxNTYwMH0.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
header = decode_jwt_header(token)
print(f"Algorithm: {header['alg']}")
# Algorithm: HS256
claims = decode_jwt_payload(token)
print(f"Subject: {claims['sub']}")
print(f"Role: {claims['role']}")
# Subject: usr_8f2a
# Role: adminपैडिंग युक्ति (+= "=" * (-len(s) % 4)) वह हिस्सा है जो सब भूल जाते हैं। JWT base64url अनुगामी = वर्ण हटा देता है, लेकिन Python के urlsafe_b64decode को उनकी आवश्यकता होती है। पैडिंग सुधार के बिना, binascii.Error: Incorrect padding मिलता है।
jwt.decode() का उपयोग करें।API प्रतिक्रियाओं और टोकन फ़ाइलों से JWT डीकोड करें
दो सबसे सामान्य व्यावहारिक परिदृश्य: HTTP प्रतिक्रिया से JWT निकालना (OAuth टोकन एंडपॉइंट, लॉगिन API), और फ़ाइलों से टोकन पढ़ना (सेवा खाता प्रमाणपत्र, Kubernetes माउंटेड सीक्रेट, डिस्क पर कैश किए गए टोकन)। दोनों में उचित त्रुटि प्रबंधन आवश्यक है। नेटवर्क अनुरोध विफल होते हैं। फ़ाइलें गायब हो जाती हैं। कैश होने और पढ़े जाने के बीच टोकन समाप्त हो जाते हैं।
नीचे के उदाहरण HTTP कॉल के लिए httpx (यदि पसंद हो तो requests से बदलें, पैटर्न समान है) और फ़ाइल संचालन के लिए pathlib.Path उपयोग करते हैं। प्रत्येक उदाहरण सामान्य except Exception की बजाय विशिष्ट PyJWT अपवाद पकड़ता है, ताकि आप प्रत्येक विफलता के लिए उचित प्रतिक्रिया दे सकें: समाप्ति पर पुनः-प्रमाणीकरण, हस्ताक्षर विफलता पर चेतावनी, नेटवर्क टाइमआउट पर पुनः प्रयास।
API प्रतिक्रिया से JWT डीकोड करें
import jwt
import httpx # or requests
TOKEN_ENDPOINT = "https://auth.example.com/oauth/token"
SECRET_KEY = "shared-webhook-signing-key"
def get_and_decode_token() -> dict:
"""Fetch an access token from the auth server and decode it."""
try:
response = httpx.post(
TOKEN_ENDPOINT,
data={
"grant_type": "client_credentials",
"client_id": "svc_order_processor",
"client_secret": "cs_9f3a7b2e",
},
timeout=10.0,
)
response.raise_for_status()
except httpx.HTTPError as exc:
raise RuntimeError(f"Token request failed: {exc}") from exc
token_data = response.json()
access_token = token_data["access_token"]
try:
payload = jwt.decode(
access_token,
SECRET_KEY,
algorithms=["HS256"],
audience="https://api.example.com",
)
return payload
except jwt.InvalidTokenError as exc:
raise RuntimeError(f"Invalid token from auth server: {exc}") from exc
claims = get_and_decode_token()
print(f"Service: {claims['sub']}, Scopes: {claims.get('scope', 'none')}")फ़ाइल से JWT डीकोड करें
import jwt
from pathlib import Path
from datetime import datetime, timezone
TOKEN_PATH = Path("/var/run/secrets/service-account-token")
PUBLIC_KEY_PATH = Path("/etc/ssl/auth/public_key.pem")
def decode_token_from_file() -> dict:
"""Read a JWT from a file, verify with a PEM public key."""
try:
token = TOKEN_PATH.read_text().strip()
public_key = PUBLIC_KEY_PATH.read_text()
except FileNotFoundError as exc:
raise RuntimeError(f"Missing file: {exc.filename}") from exc
try:
payload = jwt.decode(
token,
public_key,
algorithms=["RS256"],
audience="https://internal-api.example.com",
)
except jwt.ExpiredSignatureError:
exp_time = jwt.decode(
token,
options={"verify_signature": False},
algorithms=["RS256"],
).get("exp", 0)
expired_at = datetime.fromtimestamp(exp_time, tz=timezone.utc)
raise RuntimeError(f"Token expired at {expired_at.isoformat()}")
except jwt.InvalidTokenError as exc:
raise RuntimeError(f"Token verification failed: {exc}") from exc
return payload
claims = decode_token_from_file()
print(f"Subject: {claims['sub']}, Issuer: {claims['iss']}")कमांड-लाइन JWT डीकोडिंग
कभी-कभी आपको स्क्रिप्ट लिखे बिना टर्मिनल से टोकन देखना होता है। शायद आप OAuth प्रवाह डीबग कर रहे हैं और Authorization हेडर में क्या है देखना चाहते हैं, या ब्राउज़र DevTools से टोकन लिया है और उसकी समाप्ति जाँचनी है। Python का -c फ़्लैग इसे एक-लाइनर बनाता है। टोकन पाइप करें और क्लेम स्वरूपित JSON के रूप में प्राप्त करें। कोई स्क्रिप्ट फ़ाइल नहीं चाहिए, कोई virtual environment नहीं।
# Decode JWT payload from clipboard or variable (no verification)
echo "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInJvbGUiOiJhZG1pbiJ9.sig" \
| python3 -c "
import sys, base64, json
token = sys.stdin.read().strip()
payload = token.split('.')[1]
payload += '=' * (-len(payload) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(payload)), indent=2))
"
# {
# "sub": "usr_8f2a",
# "role": "admin"
# }# Decode JWT header to check algorithm and key ID
echo "eyJhbGciOiJSUzI1NiIsImtpZCI6InNpZy0xNzI2In0.payload.sig" \
| python3 -c "
import sys, base64, json
token = sys.stdin.read().strip()
header = token.split('.')[0]
header += '=' * (-len(header) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(header)), indent=2))
"
# {
# "alg": "RS256",
# "kid": "sig-1726"
# }# If PyJWT is installed, verify and decode in one step
python3 -c "
import jwt, sys, json
token = sys.argv[1]
payload = jwt.decode(token, options={'verify_signature': False}, algorithms=['HS256'])
print(json.dumps(payload, indent=2))
" "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3JfOGYyYSJ9.sig"किसी भी टर्मिनल सेटअप के बिना दृश्य विकल्प के लिए, अपना टोकन ToolDeck JWT Decoder में चिपकाएँ और हेडर, payload, और हस्ताक्षर सत्यापन स्थिति तुरंत देखें।
python-jose और अन्य विकल्प
python-jose एक वैकल्पिक JWT लाइब्रेरी है जो JWS, JWE (एन्क्रिप्टेड टोकन), और JWK को मूल रूप से समर्थित करती है। यदि आपके अनुप्रयोग को एन्क्रिप्टेड JWT (JWE) संभालने की आवश्यकता है — जहाँ payload स्वयं एन्क्रिप्टेड है, केवल हस्ताक्षरित नहीं — तो python-jose सही विकल्प है क्योंकि PyJWT JWE का समर्थन नहीं करता। लाइब्रेरी में अंतर्निर्मित JWKS कुंजी सेट प्रबंधन भी है, जो Auth0, Okta, या Keycloak जैसे पहचान प्रदाताओं के साथ एकीकरण आसान बनाता है जो rotating key sets expose करते हैं। Decode interface PyJWT से लगभग समान है, इसलिए उनके बीच बदलने के लिए न्यूनतम कोड परिवर्तन चाहिए:
# pip install python-jose[cryptography]
from jose import jwt as jose_jwt
token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInNjb3BlIjoib3JkZXJzOnJlYWQifQ.signature"
# Verified decode — same pattern as PyJWT
payload = jose_jwt.decode(
token,
"signing-secret-key",
algorithms=["HS256"],
audience="https://api.example.com",
)
print(payload)
# {'sub': 'usr_8f2a', 'scope': 'orders:read'}
# Unverified decode
claims = jose_jwt.get_unverified_claims(token)
header = jose_jwt.get_unverified_header(token)
print(f"Algorithm: {header['alg']}, Subject: {claims['sub']}")मेरी अनुशंसा: PyJWT से शुरू करें। यह 95% JWT उपयोग के मामलों को कवर करता है, इसका सबसे बड़ा समुदाय है, और API सरल है। यदि JWE समर्थन या बेहतर JWKS प्रबंधन चाहिए तो python-jose पर जाएँ। उल्लेख के योग्य तीसरा विकल्प है Authlib, जो JWT प्रबंधन को एक बड़े OAuth/OIDC फ़्रेमवर्क के भीतर बंडल करता है। यदि आप OAuth क्लाइंट प्रवाह के लिए पहले से Authlib उपयोग कर रहे हैं, तो इसका authlib.jose.jwt मॉड्यूल दूसरी JWT निर्भरता जोड़ने से बचाता है। अन्यथा, केवल टोकन डीकोडिंग के लिए यह एक भारी निर्भरता है।
सिंटैक्स हाइलाइटिंग के साथ टर्मिनल आउटपुट
टर्मिनल में कच्चे JWT क्लेम पढ़ना त्वरित जाँच के लिए ठीक है, लेकिन जब आप नियमित रूप से टोकन payload डीबग करते हैं (मैंने यह एक आंतरिक प्रमाणीकरण गेटवे बनाते समय प्रतिदिन किया), तो रंगीन आउटपुट वास्तविक अंतर लाता है। स्ट्रिंग मान, संख्याएँ, बूलियन, और null सभी अलग-अलग रंगों में प्रदर्शित होते हैं, जिसका अर्थ है कि आप प्रत्येक वर्ण पढ़े बिना एक नज़र में अनुपस्थित अनुमति या गलत समाप्ति टाइमस्टैम्प देख सकते हैं।
rich लाइब्रेरी (pip install rich) में एक print_json फ़ंक्शन है जो JSON स्ट्रिंग या Python dict लेता है और टर्मिनल में पूर्ण सिंटैक्स हाइलाइटिंग के साथ प्रदर्शित करता है। PyJWT के साथ मिलाएँ तो एक दो-पंक्ति JWT निरीक्षण कार्यप्रवाह बनता है:
# pip install rich PyJWT
import jwt
from rich import print_json
token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInJvbGUiOiJhZG1pbiIsInBlcm1pc3Npb25zIjpbIm9yZGVyczpyZWFkIiwicmVmdW5kczpjcmVhdGUiXSwiZXhwIjoxNzExODE1NjAwfQ.sig"
payload = jwt.decode(
token,
options={"verify_signature": False},
algorithms=["HS256"]
)
# Colorized, indented JSON output in the terminal
print_json(data=payload)
# {
# "sub": "usr_8f2a", ← strings in green
# "role": "admin",
# "permissions": [
# "orders:read",
# "refunds:create"
# ],
# "exp": 1711815600 ← numbers in cyan
# }rich आउटपुट में ANSI एस्केप कोड होते हैं। इसे फ़ाइलों में न लिखें या API एंडपॉइंट से न लौटाएँ — यह केवल टर्मिनल प्रदर्शन के लिए है। सामान्य टेक्स्ट आउटपुट की आवश्यकता होने पर json.dumps() का उपयोग करें।बड़े टोकन समूहों के साथ कार्य
JWT टोकन स्वयं छोटे होते हैं (आमतौर पर 2 KB से कम), लेकिन ऐसे परिदृश्य हैं जहाँ आप उन्हें बड़ी मात्रा में संसाधित करते हैं। सुरक्षा घटना के बाद ऑडिट लॉग विश्लेषण। प्रमाणीकरण प्रदाता बदलते समय सत्र स्थानांतरण स्क्रिप्ट। अनुपालन बैच सत्यापन जहाँ आपको यह सिद्ध करना है कि पिछले 90 दिनों में जारी प्रत्येक टोकन सही कुंजी से हस्ताक्षरित था। यदि आपके पास NDJSON लॉग फ़ाइल में हज़ारों टोकन हैं, तो पंक्ति-दर-पंक्ति प्रसंस्करण पूरी फ़ाइल को memory में load करने से बचाता है और results धीरे-धीरे print होते रहते हैं।
ऑडिट लॉग से टोकन बैच सत्यापन
import jwt
import json
from pathlib import Path
SECRET_KEY = "audit-log-signing-key"
def validate_token_log(log_path: str) -> dict:
"""Process an NDJSON file where each line has a 'token' field.
Returns counts of valid, expired, and invalid tokens.
"""
stats = {"valid": 0, "expired": 0, "invalid": 0}
with open(log_path) as fh:
for line_num, line in enumerate(fh, 1):
line = line.strip()
if not line:
continue
try:
record = json.loads(line)
token = record["token"]
except (json.JSONDecodeError, KeyError):
stats["invalid"] += 1
continue
try:
jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
stats["valid"] += 1
except jwt.ExpiredSignatureError:
stats["expired"] += 1
except jwt.InvalidTokenError:
stats["invalid"] += 1
return stats
result = validate_token_log("auth-events-2026-03.ndjson")
print(f"Valid: {result['valid']}, Expired: {result['expired']}, Invalid: {result['invalid']}")
# Valid: 14832, Expired: 291, Invalid: 17NDJSON टोकन निर्यात से क्लेम निकालें
import base64
import json
from datetime import datetime, timezone
def extract_claims_stream(input_path: str, output_path: str):
"""Read tokens line by line, decode payloads, write flattened claims."""
with open(input_path) as infile, open(output_path, "w") as outfile:
for line in infile:
line = line.strip()
if not line:
continue
record = json.loads(line)
token = record.get("access_token", "")
parts = token.split(".")
if len(parts) != 3:
continue
payload_b64 = parts[1] + "=" * (-len(parts[1]) % 4)
claims = json.loads(base64.urlsafe_b64decode(payload_b64))
# Flatten into an audit-friendly record
flat = {
"timestamp": record.get("timestamp"),
"subject": claims.get("sub"),
"issuer": claims.get("iss"),
"expired_at": datetime.fromtimestamp(
claims.get("exp", 0), tz=timezone.utc
).isoformat(),
}
outfile.write(json.dumps(flat) + "\n")
extract_claims_stream("token-audit.ndjson", "claims-extract.ndjson")multiprocessing.Pool उपयोग करें, क्योंकि प्रत्येक टोकन स्वतंत्र है।सामान्य गलतियाँ
ये चार गलतियाँ कोड समीक्षाओं और Stack Overflow प्रश्नों में बार-बार आती हैं। इनमें से प्रत्येक करना आसान है, और PyJWT का त्रुटि संदेश हमेशा सीधे कारण नहीं बताता। मैंने देखा है कि पैकेज नामकरण की समस्या अकेले घंटों की डीबगिंग बर्बाद कर देती है जब कोई गलत लाइब्रेरी इंस्टॉल करता है और पूरी तरह अप्रत्याशित API मिलता है।
समस्या: pip install jwt या pip install python-jwt चलाने से एक बिल्कुल अलग पैकेज इंस्टॉल होता है। इसके बाद import jwt विफल होता है या एक ऐसा API देता है जिसे आप नहीं पहचानते।
समाधान: हमेशा pip install PyJWT से इंस्टॉल करें। आयात import jwt है। सही पैकेज की पुष्टि करने के लिए pip show PyJWT जाँचें।
pip install jwt # or pip install python-jwt import jwt # wrong package — different API entirely
pip install PyJWT import jwt # correct — this is PyJWT print(jwt.__version__) # 2.x
समस्या: PyJWT 1.x में algorithms वैकल्पिक था और किसी भी एल्गोरिदम को अनुमति देता था। इससे एक सुरक्षा भेद्यता बनती थी जहाँ आक्रमणकारी alg: none सेट कर सकता था। PyJWT 2.x अब algorithms अनुपस्थित होने पर DecodeError उठाता है।
समाधान: algorithms को हमेशा स्पष्ट सूची के रूप में पास करें। केवल वे एल्गोरिदम उपयोग करें जो आपका अनुप्रयोग वास्तव में टोकन जारी करने में उपयोग करता है।
# PyJWT 2.x — this raises DecodeError payload = jwt.decode(token, SECRET_KEY) # DecodeError: algorithms must be specified
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
समस्या: algorithms=["RS256"] के साथ jwt.decode() में स्ट्रिंग सीक्रेट पास करने से InvalidSignatureError उठता है। RS256 को PEM-एन्कोडेड सार्वजनिक कुंजी चाहिए, साझा गोपनीय स्ट्रिंग नहीं।
समाधान: PEM सार्वजनिक कुंजी फ़ाइल या पर्यावरण चर से लोड करें। cryptography पैकेज इंस्टॉल करें: pip install PyJWT cryptography।
# This fails — RS256 needs a public key, not a string secret payload = jwt.decode(token, "my-secret", algorithms=["RS256"]) # InvalidSignatureError
public_key = open("public_key.pem").read()
payload = jwt.decode(token, public_key, algorithms=["RS256"])समस्या: JWT base64url एन्कोडिंग अनुगामी = वर्ण हटा देती है। Python का base64.urlsafe_b64decode binascii.Error: Incorrect padding उठाता है यदि आप पैडिंग सुधारे बिना कच्चा खंड पास करते हैं।
समाधान: डीकोड करने से पहले पैडिंग जोड़ें: segment += '=' * (-len(segment) % 4)। यह सूत्र हमेशा सही संख्या में पैडिंग वर्ण (0, 1, 2, या 3) उत्पन्न करता है।
import base64
payload_b64 = token.split(".")[1]
data = base64.urlsafe_b64decode(payload_b64)
# binascii.Error: Incorrect paddingimport base64
payload_b64 = token.split(".")[1]
payload_b64 += "=" * (-len(payload_b64) % 4)
data = base64.urlsafe_b64decode(payload_b64) # worksPyJWT बनाम विकल्प — त्वरित तुलना
PyJWT अधिकांश Python अनुप्रयोगों के लिए सही प्रारंभिक बिंदु है। यह HMAC और (cryptography बैकएंड के साथ) RSA और EC हस्ताक्षर सत्यापन को कवर करता है। यदि आपको JWE (एन्क्रिप्टेड टोकन) चाहिए, तो python-jose या Authlib पर जाएँ। मैन्युअल base64 डीकोडिंग डीबगिंग के लिए काम करती है लेकिन कोई सुरक्षा गारंटी नहीं देती।
अधिकांश मानक वेब सेवाओं के लिए PyJWT पर्याप्त है जो HS256 या RS256 सत्यापन का उपयोग करती हैं। जब architecture में encrypted tokens या JWKS rotation की आवश्यकता हो, तो python-jose बेहतर विकल्प है। pip अनुपलब्ध परिवेशों — जैसे CI कंटेनर या प्रतिबंधित Lambda वातावरण — में त्वरित निरीक्षण के लिए मैन्युअल base64 डीकोडिंग काम आती है। यदि परियोजना पहले से Authlib को OAuth के लिए उपयोग कर रही है, तो अलग से JWT लाइब्रेरी जोड़ने की आवश्यकता नहीं।
बिना कोड के विकल्प के लिए, कोई भी टोकन JWT Decoder में चिपकाएँ और क्लेम सत्यापन प्रतिक्रिया के साथ डीकोडेड हेडर और payload देखें।
अक्सर पूछे जाने वाले प्रश्न
Python में हस्ताक्षर सत्यापित किए बिना JWT कैसे डीकोड करें?
jwt.decode() में options={"verify_signature": False} और algorithms=["HS256"] पास करें। यह हस्ताक्षर जाँचे बिना payload dict लौटाता है। इसका उपयोग केवल निरीक्षण के लिए करें — सही सार्वजनिक कुंजी लाने से पहले क्लेम पढ़ना, या विकास के दौरान डीबगिंग। जो टोकन किसी भी संसाधन तक पहुँच नियंत्रित करते हैं, उनके लिए सत्यापन कभी न छोड़ें।
import jwt
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfOGYyYSIsInJvbGUiOiJhZG1pbiJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
payload = jwt.decode(
token,
options={"verify_signature": False},
algorithms=["HS256"]
)
print(payload)
# {'sub': 'usr_8f2a', 'role': 'admin'}PyJWT और python-jwt में क्या अंतर है?
PyJWT (pip install PyJWT, import jwt) Python के लिए सबसे लोकप्रिय JWT लाइब्रेरी है जिसे प्रति माह 8 करोड़ से अधिक बार डाउनलोड किया जाता है। python-jwt (pip install python_jwt) एक अलग, बहुत कम उपयोग की जाने वाली लाइब्रेरी है जिसका API भिन्न है। यदि किसी के कोड में import jwt दिखे, तो वे PyJWT का उपयोग कर रहे हैं। यह भ्रम PyPI पैकेज नाम (PyJWT) और आयात नाम (jwt) के अलग होने से होता है। जब तक कोई विशेष कारण न हो, PyJWT का उपयोग करें।
Python में RS256 के साथ JWT कैसे डीकोड करें?
PyJWT और cryptography बैकएंड दोनों इंस्टॉल करें: pip install PyJWT cryptography। फिर key आर्गुमेंट के रूप में PEM-एन्कोडेड सार्वजनिक कुंजी और algorithms=["RS256"] पास करें। PyJWT RSA हस्ताक्षर सत्यापन के लिए cryptography लाइब्रेरी का उपयोग करता है। cryptography पैकेज के बिना, RSA या EC एल्गोरिदम उपयोग करने पर PyJWT त्रुटि उठाता है।
import jwt
public_key = open("public_key.pem").read()
payload = jwt.decode(
token,
public_key,
algorithms=["RS256"],
audience="https://api.example.com"
)PyJWT ExpiredSignatureError क्यों उठाता है?
PyJWT डिफ़ॉल्ट रूप से exp (समाप्ति) क्लेम जाँचता है। यदि वर्तमान UTC समय exp टाइमस्टैम्प से आगे है, तो यह jwt.ExpiredSignatureError उठाता है। leeway पैरामीटर से घड़ी के अंतर की सहनशीलता जोड़ सकते हैं: jwt.decode(token, key, algorithms=["HS256"], leeway=timedelta(seconds=30))। यह 30 सेकंड की छूट देता है। समाप्ति जाँच पूरी तरह अक्षम करने के लिए (उत्पादन में अनुशंसित नहीं) options={"verify_exp": False} पास करें।
import jwt
from datetime import timedelta
try:
payload = jwt.decode(token, secret, algorithms=["HS256"], leeway=timedelta(seconds=30))
except jwt.ExpiredSignatureError:
print("Token has expired — prompt re-authentication")क्या Python में बिना किसी लाइब्रेरी के JWT क्लेम पढ़ सकते हैं?
हाँ। टोकन को बिंदुओं पर विभाजित करें, दूसरा खंड (payload) लें, उसे = वर्णों से पैड करें ताकि लंबाई 4 की गुणज हो, फिर base64url-डीकोड करें और JSON पार्स करें। इससे आपको क्लेम dict मिलती है लेकिन हस्ताक्षर सत्यापित नहीं होता। यह उन प्रतिबंधित परिवेशों में उपयोगी है जहाँ PyJWT इंस्टॉल नहीं कर सकते, या त्वरित डीबगिंग स्क्रिप्ट के लिए।
import base64, json
token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c3JfOGYyYSJ9.signature"
payload_b64 = token.split(".")[1]
payload_b64 += "=" * (-len(payload_b64) % 4) # fix padding
claims = json.loads(base64.urlsafe_b64decode(payload_b64))
print(claims) # {'sub': 'usr_8f2a'}PyJWT के साथ audience क्लेम कैसे सत्यापित करें?
jwt.decode() में audience पैरामीटर पास करें: jwt.decode(token, key, algorithms=["HS256"], audience="https://api.example.com")। PyJWT टोकन के aud क्लेम की तुलना आपके दिए मान से करता है। यदि टोकन में aud क्लेम नहीं है, या मान मेल नहीं खाता, तो jwt.InvalidAudienceError उठता है। यदि आपकी सेवा अनेक API के लिए टोकन स्वीकार करती है, तो स्वीकार्य audience की सूची भी पास कर सकते हैं।
import jwt
payload = jwt.decode(
token,
secret,
algorithms=["HS256"],
audience=["https://api.example.com", "https://admin.example.com"]
)संबंधित उपकरण
Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.