Try it yourself with our free Jwt Decoder tool — runs entirely in your browser, no signup needed.

How to Decode JWT tokens in Python

How to decode JWT tokens in Python

JSON Web Tokens (JWTs) have become a widely adopted standard for authentication and authorization in web applications. Decoding JWT tokens is a crucial step in verifying the authenticity of incoming requests. In this guide, we will walk through the process of decoding JWT tokens in Python, covering the basics, edge cases, and performance tips.

Quick Example


Here is a minimal example that decodes a JWT token using the pyjwt library:

import jwt

def decode_jwt(token):
    try:
        payload = jwt.decode(token, options={"verify_signature": False})
        return payload
    except jwt.ExpiredSignatureError:
        print("Token has expired")
    except jwt.InvalidTokenError:
        print("Invalid token")

# Example usage:
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGFuIjoiMjMwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
print(decode_jwt(token))

This example decodes a JWT token and prints the payload. Note that we set verify_signature to False to disable signature verification.

Step-by-Step Breakdown


Let's break down the code line by line:

  1. import jwt: We import the jwt library, which is the most popular and widely-used JWT library in Python.
  2. def decode_jwt(token): We define a function decode_jwt that takes a token as input.
  3. try-except block: We wrap the decoding process in a try-except block to catch any errors that may occur during decoding.
  4. jwt.decode(token, options={"verify_signature": False}): We call the decode function from the jwt library, passing the token and an options dictionary with verify_signature set to False. This tells the library not to verify the signature of the token.
  5. except jwt.ExpiredSignatureError: We catch the ExpiredSignatureError exception, which is raised when the token has expired.
  6. except jwt.InvalidTokenError: We catch the InvalidTokenError exception, which is raised when the token is invalid.

Handling Edge Cases


Here are some common edge cases to consider:

Empty/Null Input

If the input token is empty or null, we should raise a ValueError:

def decode_jwt(token):
    if not token:
        raise ValueError("Token cannot be empty or null")
    # ...

Invalid Input

If the input token is invalid (e.g., not a string), we should raise a TypeError:

def decode_jwt(token):
    if not isinstance(token, str):
        raise TypeError("Token must be a string")
    # ...

Large Input

If the input token is very large, we may want to consider using a streaming decoder to avoid loading the entire token into memory:

import jwt

def decode_jwt(token):
    with open(token, 'rb') as f:
        payload = jwt.decode(f.read(), options={"verify_signature": False})
    return payload

Unicode/Special Characters

If the input token contains Unicode or special characters, we should ensure that our decoder can handle them correctly:

import jwt

def decode_jwt(token):
    try:
        payload = jwt.decode(token.encode('utf-8'), options={"verify_signature": False})
        return payload
    except jwt.ExpiredSignatureError:
        print("Token has expired")
    except jwt.InvalidTokenError:
        print("Invalid token")

Common Mistakes


Here are some common mistakes developers make when decoding JWT tokens in Python:

Mistake 1: Not verifying the signature

# WRONG
payload = jwt.decode(token, options={"verify_signature": False})

Corrected code:

payload = jwt.decode(token, key="your_secret_key", algorithms=["HS256"])

Mistake 2: Not handling errors

# WRONG
payload = jwt.decode(token)

Corrected code:

try:
    payload = jwt.decode(token)
except jwt.ExpiredSignatureError:
    print("Token has expired")
except jwt.InvalidTokenError:
    print("Invalid token")

Mistake 3: Not validating the token structure

# WRONG
payload = jwt.decode(token)

Corrected code:

try:
    payload = jwt.decode(token)
    if not payload.get("iss") or not payload.get("aud"):
        raise ValueError("Invalid token structure")
except jwt.ExpiredSignatureError:
    print("Token has expired")
except jwt.InvalidTokenError:
    print("Invalid token")

Performance Tips


Here are some performance tips for decoding JWT tokens in Python:

  1. Use a caching layer: If you're decoding tokens frequently, consider using a caching layer to store the decoded payloads.
  2. Use a streaming decoder: If you're dealing with very large tokens, consider using a streaming decoder to avoid loading the entire token into memory.
  3. Use a multi-threaded approach: If you're decoding multiple tokens concurrently, consider using a multi-threaded approach to take advantage of multiple CPU cores.

FAQ


Q: What is the difference between HS256 and RS256?

A: HS256 uses a secret key to sign and verify the token, while RS256 uses a public/private key pair.

Q: How do I verify the signature of a JWT token?

A: You can verify the signature by passing the secret key or public key to the decode function.

Q: What happens if the token has expired?

A: If the token has expired, the decode function will raise an ExpiredSignatureError.

Q: Can I use JWT tokens with Python 2.x?

A: Yes, the pyjwt library supports Python 2.x, but it's recommended to use Python 3.x for security and performance reasons.

Q: How do I handle Unicode characters in JWT tokens?

A: You can handle Unicode characters by encoding the token using the utf-8 encoding scheme.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp