Skip to content

Instantly share code, notes, and snippets.

@jacopofar
Created July 25, 2018 15:32
Show Gist options
  • Save jacopofar/a1ba8c846142f5486dfa8795ffeedc7b to your computer and use it in GitHub Desktop.
Save jacopofar/a1ba8c846142f5486dfa8795ffeedc7b to your computer and use it in GitHub Desktop.
Python 3 JWT example with keypair
import datetime
import time
# not used, but required by pyjwt, import to ensure it exists
import cryptography
import jwt
key = 'secret'
encoded = jwt.encode({'some': 'payload'}, key, algorithm='HS256')
print('encoded', encoded)
decoded = jwt.decode(encoded, key, algorithms='HS256')
print('decode', decoded)
# To generate them:
# ssh-keygen -t rsa -b 4096 -f jwtRS256.key
# Don't add passphrase
# openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub
private_key='''
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
'''
public_key='''
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2F/6wnzguqxfR/Pl4CTR
6e8MHfN0Oh+fjiN5HA14WOtI/+/EgVD+krzEhQ/3aVcbNlL5ipF4cymKxYy4h/d+
9fI0GAMCto1V0wTJDjSCGqCOZYED5VrDxbTHXLZNvn5QiC8Q8KMPTGQCQHN9WKXg
ixpa8NvPZjva5yEmL/f0HzmckHZxTtG+IZ2CxX2MSOumtyd/enc2InV1iYg935FP
O6SpS7kOBxWx/hTnZMAOu3tVdYE22hiKUAKkeImyfvy+1sXtMGL1MCQ4IiAbybWh
+t1VDr9y25kBCcbHsvAyB1/w3fY750piNaF4vdAqNNzVz2ZxqutmvRLvd0YjKEvt
DcNgKWuO1vCWT2Ot6QQXYL4jY9R3QJW3pAIoNGx+Ln/JCJdSviSn2FJNzSOvjFzC
qqeIzw9pfTYrlLeTYN8iZUKQAMe6ny7fzYiDzW2HZRg22qclAYXmsTM2jFTsmDfw
fiLmmf0eNK0jhefMFPRu9E1dBFC+teLofLS627R/4UZ1HNpjOouHEDhbocoFSqtU
IYJWcAt9t8FiIwoKkvMO/5QbfbGcr2SuV8ueCNk5oYHWkMHyBAp/Fn0Zj8EnYAvz
OjDULlpfTPR2H1mvb/9traVwmgPhVuPRZJGyDz8heOSNMNd3n0fym4ggXTBgl/Gw
K3PRHcQnPPlx3Hjs0hDn6A0CAwEAAQ==
-----END PUBLIC KEY-----
'''
encoded = jwt.encode({'some': 'payload'}, private_key, algorithm='RS256')
decoded = jwt.decode(encoded, public_key, algorithms='RS256')
print('decoded with key: ', decoded)
current_timestamp = (datetime.datetime.utcnow()-datetime.datetime(1970,1,1)).total_seconds()
encoded = jwt.encode({'some': 'payload', 'exp': current_timestamp + 3}, private_key, algorithm='RS256')
for _ in range(100):
decoded = jwt.decode(encoded, public_key, algorithms='RS256')
print('decoded with key: ', decoded)
time.sleep(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment