Skip to content

Commit b9a0c0f

Browse files
committed
allow iat override for JWT pack
1 parent b44155b commit b9a0c0f

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

src/cryptojwt/jwt.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,13 @@ def put_together_aud(recv, aud=None):
179179

180180
return _aud
181181

182-
def pack_init(self, recv, aud):
182+
def pack_init(self, recv, aud, iat=None):
183183
"""
184184
Gather initial information for the payload.
185185
186186
:return: A dictionary with claims and values
187187
"""
188-
argv = {"iss": self.iss, "iat": utc_time_sans_frac()}
188+
argv = {"iss": self.iss, "iat": iat or utc_time_sans_frac()}
189189
if self.lifetime:
190190
argv["exp"] = argv["iat"] + self.lifetime
191191

@@ -210,7 +210,7 @@ def pack_key(self, issuer_id="", kid=""):
210210

211211
return keys[0] # Might be more then one if kid == ''
212212

213-
def pack(self, payload=None, kid="", issuer_id="", recv="", aud=None, **kwargs):
213+
def pack(self, payload=None, kid="", issuer_id="", recv="", aud=None, iat=None, **kwargs):
214214
"""
215215
216216
:param payload: Information to be carried as payload in the JWT
@@ -219,13 +219,14 @@ def pack(self, payload=None, kid="", issuer_id="", recv="", aud=None, **kwargs):
219219
:param recv: The intended immediate receiver
220220
:param aud: Intended audience for this JWS/JWE, not expected to
221221
contain the recipient.
222+
:param iat: Override issued at (default current timestamp)
222223
:param kwargs: Extra keyword arguments
223224
:return: A signed or signed and encrypted Json Web Token
224225
"""
225226
_args = {}
226227
if payload is not None:
227228
_args.update(payload)
228-
_args.update(self.pack_init(recv, aud))
229+
_args.update(self.pack_init(recv, aud, iat))
229230

230231
try:
231232
_encrypt = kwargs["encrypt"]

tests/test_09_jwt.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,29 @@ def test_jwt_pack_and_unpack_max_lifetime_exceeded():
135135
_ = bob.unpack(_jwt)
136136

137137

138-
def test_jwt_pack_and_unpack_unknown_issuer():
139-
alice = JWT(key_jar=ALICE_KEY_JAR, iss=ALICE, sign_alg="RS256")
138+
def test_jwt_pack_and_unpack_max_lifetime_exceeded():
139+
lifetime = 3600
140+
alice = JWT(key_jar=ALICE_KEY_JAR, iss=ALICE, sign_alg="RS256", lifetime=lifetime)
140141
payload = {"sub": "sub"}
141142
_jwt = alice.pack(payload=payload)
142143

143-
kj = KeyJar()
144-
bob = JWT(key_jar=kj, iss=BOB, allowed_sign_algs=["RS256"])
145-
with pytest.raises(IssuerNotFound):
146-
info = bob.unpack(_jwt)
144+
bob = JWT(
145+
key_jar=BOB_KEY_JAR, iss=BOB, allowed_sign_algs=["RS256"], allowed_max_lifetime=lifetime - 1
146+
)
147+
with pytest.raises(VerificationError):
148+
_ = bob.unpack(_jwt)
149+
150+
151+
def test_jwt_pack_and_unpack_timestamp():
152+
lifetime = 3600
153+
alice = JWT(key_jar=ALICE_KEY_JAR, iss=ALICE, sign_alg="RS256", lifetime=lifetime)
154+
payload = {"sub": "sub"}
155+
_jwt = alice.pack(payload=payload, iat=42)
156+
157+
bob = JWT(key_jar=BOB_KEY_JAR, iss=BOB, allowed_sign_algs=["RS256"])
158+
_ = bob.unpack(_jwt, timestamp=42)
159+
with pytest.raises(VerificationError):
160+
_ = bob.unpack(_jwt)
147161

148162

149163
def test_jwt_pack_and_unpack_unknown_key():

0 commit comments

Comments
 (0)