Skip to content

Commit da98964

Browse files
committed
Merge pull request jpadilla#34 from vanzi/master
Added support for custom headers in encode method
2 parents 257fd34 + 90beaa3 commit da98964

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ Usage
1818
import jwt
1919
jwt.encode({"some": "payload"}, "secret")
2020

21+
Additional headers may also be specified.
22+
23+
jwt.encode({"some": "payload"}, "secret", headers={"kid": "230498151c214b788dd97f22b85410a5"})
24+
2125
Note the resulting JWT will not be encrypted, but verifiable with a secret key.
2226

2327
jwt.decode("someJWTstring", "secret")

jwt/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ def prepare_HS_key(key):
6767
from Crypto.Hash import SHA384
6868
from Crypto.Hash import SHA512
6969
from Crypto.PublicKey import RSA
70-
70+
7171
signing_methods.update({
7272
'RS256': lambda msg, key: PKCS1_v1_5.new(key).sign(SHA256.new(msg)),
7373
'RS384': lambda msg, key: PKCS1_v1_5.new(key).sign(SHA384.new(msg)),
7474
'RS512': lambda msg, key: PKCS1_v1_5.new(key).sign(SHA512.new(msg))
7575
})
76-
76+
7777
verify_methods.update({
7878
'RS256': lambda msg, key, sig: PKCS1_v1_5.new(key).verify(SHA256.new(msg), sig),
7979
'RS384': lambda msg, key, sig: PKCS1_v1_5.new(key).verify(SHA384.new(msg), sig),
@@ -139,7 +139,7 @@ def header(jwt):
139139
raise DecodeError("Invalid header encoding")
140140

141141

142-
def encode(payload, key, algorithm='HS256'):
142+
def encode(payload, key, algorithm='HS256', headers=None):
143143
segments = []
144144

145145
# Check that we get a mapping
@@ -149,6 +149,8 @@ def encode(payload, key, algorithm='HS256'):
149149

150150
# Header
151151
header = {"typ": "JWT", "alg": algorithm}
152+
if headers:
153+
header.update(headers)
152154
json_header = json.dumps(header, separators=(',', ':')).encode('utf-8')
153155
segments.append(base64url_encode(json_header))
154156

tests/test_jwt.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ def test_verify_signature_no_secret(self):
123123
lambda: jwt.verify_signature(decoded_payload, signing,
124124
header, signature))
125125

126+
def test_custom_headers(self):
127+
right_secret = 'foo'
128+
headers = {'foo': 'bar', 'kid': 'test'}
129+
jwt_message = jwt.encode(self.payload, right_secret, headers=headers)
130+
decoded_payload, signing, header, signature = jwt.load(jwt_message)
131+
132+
for key, value in headers.items():
133+
self.assertEqual(header[key], value)
134+
126135
def test_invalid_crypto_alg(self):
127136
self.assertRaises(NotImplementedError, jwt.encode, self.payload,
128137
"secret", "HS1024")

0 commit comments

Comments
 (0)