Skip to content

Commit 0360fa3

Browse files
authoredFeb 13, 2025··
Replace usage of deprecated datetime.utcnow() with datetime.now(UTC) (#360)
* Replace usage of deprecated datetime.utcnow() with datetime.now(UTC) * fix: reorder imports for consistency in jwt.py and test_jwt.py * fix: correct usage of datetime.now(UTC) in JWT validation functions * fix: update datetime usage for compatibility with Python versions Refactor datetime imports and usage to ensure compatibility with Python 3.12 and 3.13. Replace deprecated datetime.utcnow() with datetime.now(UTC) and handle ImportError for older versions. * fix: update datetime usage for compatibility with Python 3.12 and 3.13 - Replace deprecated datetime.utcnow() with datetime.now(UTC) for better compatibility. - Adjusted import statements and usage in jwt.py and test_jwt.py for consistency.
1 parent 12f30c8 commit 0360fa3

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed
 

‎jose/jwt.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@
55
from collections.abc import Mapping
66
except ImportError:
77
from collections import Mapping
8-
from datetime import datetime, timedelta
8+
9+
try:
10+
from datetime import UTC, datetime, timedelta
11+
12+
utc_now = datetime.now(UTC) # Preferred in Python 3.13+
13+
except ImportError:
14+
from datetime import datetime, timedelta, timezone
15+
16+
utc_now = datetime.now(timezone.utc) # Preferred in Python 3.12 and below
17+
UTC = timezone.utc
918

1019
from jose import jws
1120

@@ -281,7 +290,7 @@ def _validate_nbf(claims, leeway=0):
281290
except ValueError:
282291
raise JWTClaimsError("Not Before claim (nbf) must be an integer.")
283292

284-
now = timegm(datetime.utcnow().utctimetuple())
293+
now = timegm(datetime.now(UTC).utctimetuple())
285294

286295
if nbf > (now + leeway):
287296
raise JWTClaimsError("The token is not yet valid (nbf)")
@@ -311,7 +320,7 @@ def _validate_exp(claims, leeway=0):
311320
except ValueError:
312321
raise JWTClaimsError("Expiration Time claim (exp) must be an integer.")
313322

314-
now = timegm(datetime.utcnow().utctimetuple())
323+
now = timegm(datetime.now(UTC).utctimetuple())
315324

316325
if exp < (now - leeway):
317326
raise ExpiredSignatureError("Signature has expired.")
@@ -385,7 +394,7 @@ def _validate_sub(claims, subject=None):
385394
"sub" value is a case-sensitive string containing a StringOrURI
386395
value. Use of this claim is OPTIONAL.
387396
388-
Args:
397+
Arg
389398
claims (dict): The claims dictionary to validate.
390399
subject (str): The subject of the token.
391400
"""

‎tests/test_jwt.py

+22-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
import base64
22
import json
3-
from datetime import datetime, timedelta
3+
4+
try:
5+
from datetime import UTC, datetime, timedelta
6+
7+
utc_now = datetime.now(UTC) # Preferred in Python 3.13+
8+
except ImportError:
9+
from datetime import datetime, timedelta, timezone
10+
11+
utc_now = datetime.now(timezone.utc) # Preferred in Python 3.12 and below
12+
UTC = timezone.utc
13+
414

515
import pytest
616

@@ -180,7 +190,7 @@ def test_leeway_is_int(self):
180190
pass
181191

182192
def test_leeway_is_timedelta(self, claims, key):
183-
nbf = datetime.utcnow() + timedelta(seconds=5)
193+
nbf = datetime.now(UTC) + timedelta(seconds=5)
184194
leeway = timedelta(seconds=10)
185195

186196
claims = {
@@ -209,15 +219,15 @@ def test_nbf_not_int(self, key):
209219
jwt.decode(token, key)
210220

211221
def test_nbf_datetime(self, key):
212-
nbf = datetime.utcnow() - timedelta(seconds=5)
222+
nbf = datetime.now(UTC) - timedelta(seconds=5)
213223

214224
claims = {"nbf": nbf}
215225

216226
token = jwt.encode(claims, key)
217227
jwt.decode(token, key)
218228

219229
def test_nbf_with_leeway(self, key):
220-
nbf = datetime.utcnow() + timedelta(seconds=5)
230+
nbf = datetime.now(UTC) + timedelta(seconds=5)
221231

222232
claims = {
223233
"nbf": nbf,
@@ -229,7 +239,7 @@ def test_nbf_with_leeway(self, key):
229239
jwt.decode(token, key, options=options)
230240

231241
def test_nbf_in_future(self, key):
232-
nbf = datetime.utcnow() + timedelta(seconds=5)
242+
nbf = datetime.now(UTC) + timedelta(seconds=5)
233243

234244
claims = {"nbf": nbf}
235245

@@ -239,7 +249,7 @@ def test_nbf_in_future(self, key):
239249
jwt.decode(token, key)
240250

241251
def test_nbf_skip(self, key):
242-
nbf = datetime.utcnow() + timedelta(seconds=5)
252+
nbf = datetime.now(UTC) + timedelta(seconds=5)
243253

244254
claims = {"nbf": nbf}
245255

@@ -261,15 +271,15 @@ def test_exp_not_int(self, key):
261271
jwt.decode(token, key)
262272

263273
def test_exp_datetime(self, key):
264-
exp = datetime.utcnow() + timedelta(seconds=5)
274+
exp = datetime.now(UTC) + timedelta(seconds=5)
265275

266276
claims = {"exp": exp}
267277

268278
token = jwt.encode(claims, key)
269279
jwt.decode(token, key)
270280

271281
def test_exp_with_leeway(self, key):
272-
exp = datetime.utcnow() - timedelta(seconds=5)
282+
exp = datetime.now(UTC) - timedelta(seconds=5)
273283

274284
claims = {
275285
"exp": exp,
@@ -281,7 +291,7 @@ def test_exp_with_leeway(self, key):
281291
jwt.decode(token, key, options=options)
282292

283293
def test_exp_in_past(self, key):
284-
exp = datetime.utcnow() - timedelta(seconds=5)
294+
exp = datetime.now(UTC) - timedelta(seconds=5)
285295

286296
claims = {"exp": exp}
287297

@@ -291,7 +301,7 @@ def test_exp_in_past(self, key):
291301
jwt.decode(token, key)
292302

293303
def test_exp_skip(self, key):
294-
exp = datetime.utcnow() - timedelta(seconds=5)
304+
exp = datetime.now(UTC) - timedelta(seconds=5)
295305

296306
claims = {"exp": exp}
297307

@@ -504,8 +514,8 @@ def test_unverified_claims_object(self, claims, key):
504514
[
505515
("aud", "aud"),
506516
("ait", "ait"),
507-
("exp", datetime.utcnow() + timedelta(seconds=3600)),
508-
("nbf", datetime.utcnow() - timedelta(seconds=5)),
517+
("exp", utc_now + timedelta(seconds=3600)),
518+
("nbf", utc_now - timedelta(seconds=5)),
509519
("iss", "iss"),
510520
("sub", "sub"),
511521
("jti", "jti"),

0 commit comments

Comments
 (0)
Please sign in to comment.