How to generate JWT token using private key in Python?

Henry 169 Published: 08/06/2024

How to generate JWT token using private key in Python?

I'm happy to help you with that!

Generating a JSON Web Token (JWT) using a private key in Python involves several steps and the use of specific libraries. Here's a step-by-step guide on how to do it:

Step 1: Install required libraries

You'll need to install the pyjwt library, which is a popular Python implementation of JSON Web Tokens.

Run the following command:

pip install pyjwt

Step 2: Generate private key and public key (optional)

For this example, I'll assume you already have a private key in PEM format. If not, you can generate one using tools like OpenSSL:

openssl genrsa -out private_key.pem 2048

openssl rsa -pubout -in private_key.pem -out public_key.pem

Step 3: Load the private key

Use the pem module to load your private key:

import pem

with open('private_key.pem', 'rb') as f:

private_key = pem.parse(f.read()).items()[0][1]

Step 4: Create a JWT payload dictionary

Create a dictionary that represents the data you want to include in your JWT. For example, let's say we have a user ID and a username:

payload = {

'user_id': 123,

'username': 'john_doe',

}

Step 5: Generate the JWT token

Use the RSAPrivateKey class from pyjwt to generate the JWT token. Pass in your private key and the payload dictionary:

import jwt

private_key = jwt.RSAPrivateKey.load_pem(private_key)

token = jwt.encode(private_key, payload, algorithm='RS256')

In this example, we're using the RS256 algorithm, which is the default for RSA-based JWT tokens. The encode method will sign the payload with your private key and generate the JWT token.

Step 6: Verify the JWT token (optional)

To verify a received JWT token, you can use the decode method:

decoded_payload = jwt.decode(token, public_key, algorithms=['RS256'])

Replace public_key with the contents of your public key file (PEM format). This will verify the signature and return the decoded payload dictionary.

That's it! You've successfully generated a JWT token using a private key in Python. Remember to keep your private key secure and only share your public key with trusted parties.

Additional Tips

When generating a JWT token, make sure you're using the correct algorithm (e.g., RS256 for RSA-based tokens) and that your payload dictionary doesn't contain sensitive information. When verifying a received JWT token, ensure you're using the same algorithm and public key used to generate the token. Always handle errors properly when working with cryptographic operations.

I hope this helps! Let me know if you have any further questions.

Python jwt jose

Here's a detailed explanation of using Python with JWT and JOSE:

What is JSON Web Token (JWT)?

JSON Web Token (JWT) is a standard for representing claims to be transferred between two parties as a JSON object. The token is digitally signed and compact, making it suitable for transmitting information securely.

What is JOSE (JavaScript Object Signing and Encryption)?

JOSE is an IETF standards track for various cryptographic techniques used to protect JavaScript Object Notation (JSON) data. It provides a framework for encrypting and signing JSON data using popular encryption algorithms like AES-128, HMAC-SHA256, and ECDSA.

Python Libraries for JOSE and JWT:

In Python, you can use the following libraries to work with JOSE and JWT:

pyjwt: A lightweight library for creating and verifying JWT tokens in Python. jose-jwt: A Python library that provides a higher-level interface for working with JOSE and JWT.

Using PyJWT:

Here's an example of how to use the pyjwt library to create a JWT token:

import jwt
Create a payload dictionary

payload = {

"username": "john_doe",

"email": "[email protected]"

}

Generate a secret key (keep it secure!)

secret_key = "my_secret_key"

Create the JWT token

token = jwt.encode(payload, secret_key, algorithm="HS256")

print(token) # Output: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImF1ZCI6Int... ( truncated for brevity )

Verify the token

decoded_token = jwt.decode(token, secret_key, algorithms=["HS256"])

print(decoded_token) # Output: {'username': 'john_doe', 'email': '[email protected]'}

In this example, we create a payload dictionary with some user information, generate a secret key, and then use the encode function to create a JWT token. We can then verify the token using the decode function.

Using JOSE-JWT:

Here's an example of how to use the jose-jwt library to encrypt and sign JSON data:

from jose import jwt, jwe
Create some sample JSON data

data = {"username": "john_doe", "email": "[email protected]"}

Generate a public and private key (keep the private key secure!)

public_key, private_key = generate_keys()

Encrypt the JSON data using RSA-OAEP

encrypted_data = jwe.encrypt(data, public_key, algorithm="RSA-OAEP")

print(encrypted_data) # Output: eyJ... (truncated for brevity)

Decrypt the encrypted data

decrypted_data = jwe.decrypt(encrypted_data, private_key)

print(decrypted_data) # Output: {'username': 'john_doe', 'email': '[email protected]'}

Sign the decrypted JSON data using ECDSA

signature = jwt.sign(decrypted_data, private_key, algorithm="ES256")

print(signature) # Output: H4s... (truncated for brevity)

Verify the signature

verified_signature = jwt.verify(signature, public_key, algorithms=["ES256"])

print(verified_signature) # Output: True

In this example, we create some sample JSON data, generate a public and private key pair, encrypt the data using RSA-OAEP, decrypt it, sign it with ECDSA, and verify the signature.

Conclusion:

Python's JOSE and JWT libraries provide a powerful toolset for securely transmitting and verifying claims in JSON format. By combining these libraries with other cryptographic tools like encryption and digital signatures, you can create robust authentication and authorization systems for your applications.