Skip to content

Instantly share code, notes, and snippets.

@franbadger
Last active November 21, 2024 08:16
Show Gist options
  • Select an option

  • Save franbadger/37c60b115dba90741c262589b6c433e7 to your computer and use it in GitHub Desktop.

Select an option

Save franbadger/37c60b115dba90741c262589b6c433e7 to your computer and use it in GitHub Desktop.
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ2tzNFZxYm9lK291N2UKdDVPVVNMV0tOZk1jSUdMMUpISTYrYkZHQ09uWWQ4c203NjdZT0Y5aXZ0OExkbzZ5SFI4ekpFZ1QyY3lYWGJXOApSdmdGUGVUOWRQM2ord1dQYXFSRVAzQkEwd05PWFRWb1RUcGZCNWYrVitmcmd0dVJMWnZSSkcwNGhaOE5lM0c1CnZYVkFYRmJnSEsvRHNGY3hmVFl5clNBVStlRmlFck5pSUUyWlZZR0c5NWRONVN6QlVMaXJjRXljVDVBTXdyZVoKYzZhYmtnRVFhaitMMlBwWHdDdVR3UGM1ZmpZLzhXcEhHUmJEVXdYZ2pqRmVvMStaVW56RWQxa3F0ekFQbFdmbwpOUHk4YW9qYzZrclFqcjd2dlg4TExwWnRzblpBazcrTi96UUFpMXo1c1JUYXdBc0FqVlBwUU9NTVArZkZDYVRVCkN0ZkJDSHl0QWdNQkFBRUNnZ0VBUDdFczV2dlhndUYvZnFGL2NOaXRXOFdCUGw5SDVZVXlwNXZuOGkyQVFUWVMKV2Z4V29VY3JuQVEwUFRxYjlFVk95M2c4WjNEU3JiYVBrVC9ncWlaRlo3N1djRk9pMHROcXN2blZiendyQ3lNQQpoRlZaUFdheVlLbWVCbldVYzVBdnNiRmtpM2NoQ3hXeDVTSmZOWVNBRkNzRHphbGtEcjlkTmp1OUxGOTF5WGJTCnVqU1hPdGttNGh3cnppSFRoZmtFYmpuU1RRNXE0QzNTSWtxSU1oMkpEcXB6dndPQzBYeXBXZVBjQkZ0Y3YwYUUKK1M1clo5SGlidHpWNnFXRHdGbnhvckhQMmUwQ3FmcXZsaCtPNU90L085WStmMTNDbC9HOGNoTk54RFV2enFTVwp6T29CVlN0ejFpUGRpZm5sKzc1WG1PdEE2ODY4OExKeVFKLzNZTlNVQVFLQmdRRGJ0Y1VWNGRiR1J3eXlOV0lwClE4dTdDeUtyYWtITXM1dDFzZ2hvZytjaFhxQmVYcDBFUDNDdG9TU1E5NlF1V0t1bGgwTGZxWEoyTlRFNFJGc1UKRis3d0tFUVB0c3Q4QktMVldCbmUyMFlwOUxUdktQb2FzaEM0Mkp5R21iaEJEbGU3dGZRd0N1UXRzSGlxdytaVgp0UGg4MjhBYnh0UGl5cTc4RjcxTzBBUmx2d0tCZ1FDLzU4SFVWQmpsVVZkY1E2L3RHOGJUTmFkN29ZL0lzaDJ5CjMxOHRVWGZhRTRmcWRHOERkV2djR283czlrMXA1WitWajNxeHRHamNsMVNGVDFheDZTdHl5UmhGZEpsUVFVY0EKU3NmK3pjNEdseTd6V3dNcXp6OVEwMkdVSGFUKzJzRjBlYWFyWnZwODJIOEE1aUQ3TjlJUEQybmtJUS9QVTd2cwpHVFd5VHFId2t3S0JnSGdnRWZtODJLamYvOWtQeHZPNDFaTVdxNFg5T3F5cEpyNWE4SzMwTUZMV1llZzI0cktICjNSdVJsMlNMZ1lDMWltT2VhTG5RODN3ZDZTTlNmRm1vSEVQQ1FEUTNSVm94VHJaR3pSNUQxVURyUW1IZ2paNDYKN1ZtalZURmlxcE1uUEdDdFF5MWhSeENVQStXWjVqM0dESFozejdsZ0pFbERlQmp0QWR3dGI3b1JBb0dCQUluSwpEaEkyaittWGpmSmhaMkFJSWFwbFMrd3BCT1JGZjYxL1ZRZGxCM2s5ck1sYThKcTdJaFdMdkRQSVphMHpnbklRCm96Z1ZJWFhCOHA0RmFXbzAwVTJKdGpPb2xLeGJNbSt6UWdaaUh4djhVV25LWDJ2Tmd0aTE3Y283dnN4K3BZak0KRUMvaHNOa1RXWjE3bnhMQjhjRitmN21kUTR6SndwU3pSU3JSNnRTaEFvR0FVUzVxYzV3cWhUYnBXcDFRU2NoeQpUMURZSW9aR0lJMDFpZHpYU2RrMTJrYklmWTQ2LzlIL3QwMURZcmhvczg4ZjJwK2didDR4Z0d4SCs0ZG5pQ2wrCkFaRUFYUVpuakV3WVQwME5hTDYydWZsdkg0VHJhZjNQM3A3ZkZqRkJkVUh3TUtCTWxjUXBWMDNuTU5tdVd1TDMKQU1IZndkcnUwWSthaThRRFY2d0tVcVE9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwTE9GYW02SHZxTHUzcmVUbEVpMQppalh6SENCaTlTUnlPdm14UmdqcDJIZkxKdSt1MkRoZllyN2ZDM2FPc2gwZk15UklFOW5NbDEyMXZFYjRCVDNrCi9YVDk0L3NGajJxa1JEOXdRTk1EVGwwMWFFMDZYd2VYL2xmbjY0TGJrUzJiMFNSdE9JV2ZEWHR4dWIxMVFGeFcKNEJ5dnc3QlhNWDAyTXEwZ0ZQbmhZaEt6WWlCTm1WV0JodmVYVGVVc3dWQzRxM0JNbkUrUURNSzNtWE9tbTVJQgpFR28vaTlqNlY4QXJrOEQzT1g0MlAvRnFSeGtXdzFNRjRJNHhYcU5mbVZKOHhIZFpLcmN3RDVWbjZEVDh2R3FJCjNPcEswSTYrNzcxL0N5NldiYkoyUUpPL2pmODBBSXRjK2JFVTJzQUxBSTFUNlVEakREL254UW1rMUFyWHdRaDgKclFJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==
import base64
import time
import jwt as JWT
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key
JWT_SERVER_PUBLIC_KEY = <YOUR KEY> # better load it from environment variables
JWT_SERVER_PRIVATE_KEY = <YOUR KEY> # better load it from environment variables
class TokenAuth:
ALGORITHM = "RS256"
EXPIRATION = 60 * 60 * 24 * 7 # 24 hours
def __init__(self):
self._load_keys()
def _load_keys(self):
self.server_public_key = load_pem_public_key(
base64.b64decode(JWT_SERVER_PUBLIC_KEY), backend=default_backend()
)
self.server_private_key = load_pem_private_key(
base64.b64decode(JWT_SERVER_PRIVATE_KEY), backend=default_backend(), password=None
)
def build_jwt(self, content, expiration=None):
expiration = expiration or self.EXPIRATION
iat = time.time()
content.update(
{
"iss": "Badger",
"sub": "Auth Token",
"iat": iat,
"exp": iat + expiration,
}
)
return self.encode_jwt(content)
def encode_jwt(self, content):
return JWT.encode(
content,
self.server_private_key,
algorithm=self.ALGORITHM,
)
def decode_jwt(self, jwt_base64):
try:
return JWT.decode(
jwt_base64,
self.server_public_key,
algorithms=[self.ALGORITHM],
)
except JWT.exceptions.ExpiredSignatureError:
raise InvalidToken("Expired token")
except JWT.exceptions.InvalidSignatureError:
raise InvalidToken("Invalid signature")
except JWT.exceptions.DecodeError:
raise InvalidToken("Invalid token")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment