Skip to content

Commit a1a3062

Browse files
committed
Resolve deprecation warnings related to datetime.utcnow in python 3.12
1 parent 4b0701b commit a1a3062

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

jose/jwt.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from .constants import ALGORITHMS
1313
from .exceptions import ExpiredSignatureError, JWSError, JWTClaimsError, JWTError
14-
from .utils import calculate_at_hash, timedelta_total_seconds
14+
from .utils import calculate_at_hash, timedelta_total_seconds, utcnow
1515

1616

1717
def encode(claims, key, algorithm=ALGORITHMS.HS256, headers=None, access_token=None):
@@ -281,7 +281,7 @@ def _validate_nbf(claims, leeway=0):
281281
except ValueError:
282282
raise JWTClaimsError("Not Before claim (nbf) must be an integer.")
283283

284-
now = timegm(datetime.utcnow().utctimetuple())
284+
now = timegm(utcnow().utctimetuple())
285285

286286
if nbf > (now + leeway):
287287
raise JWTClaimsError("The token is not yet valid (nbf)")
@@ -311,7 +311,7 @@ def _validate_exp(claims, leeway=0):
311311
except ValueError:
312312
raise JWTClaimsError("Expiration Time claim (exp) must be an integer.")
313313

314-
now = timegm(datetime.utcnow().utctimetuple())
314+
now = timegm(utcnow().utctimetuple())
315315

316316
if exp < (now - leeway):
317317
raise ExpiredSignatureError("Signature has expired.")

jose/utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import base64
2+
import datetime
23
import struct
34

45
# Piggyback of the backends implementation of the function that converts a long
@@ -105,3 +106,15 @@ def ensure_binary(s):
105106
if isinstance(s, str):
106107
return s.encode("utf-8", "strict")
107108
raise TypeError(f"not expecting type '{type(s)}'")
109+
110+
111+
112+
def utcnow():
113+
try:
114+
from datetime import UTC
115+
except ImportError:
116+
# datetime.datetime.utcnow was deprecated in favor of
117+
# datetime.datetime.now(datetime.UTC) in python 3.12
118+
return datetime.datetime.utcnow()
119+
else:
120+
return datetime.datetime.now(datetime.UTC)

tests/test_jwt.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from jose import jws, jwt
88
from jose.exceptions import JWTError
9+
from jose.utils import utcnow
910

1011

1112
@pytest.fixture
@@ -180,7 +181,7 @@ def test_leeway_is_int(self):
180181
pass
181182

182183
def test_leeway_is_timedelta(self, claims, key):
183-
nbf = datetime.utcnow() + timedelta(seconds=5)
184+
nbf = utcnow() + timedelta(seconds=5)
184185
leeway = timedelta(seconds=10)
185186

186187
claims = {
@@ -209,15 +210,15 @@ def test_nbf_not_int(self, key):
209210
jwt.decode(token, key)
210211

211212
def test_nbf_datetime(self, key):
212-
nbf = datetime.utcnow() - timedelta(seconds=5)
213+
nbf = utcnow() - timedelta(seconds=5)
213214

214215
claims = {"nbf": nbf}
215216

216217
token = jwt.encode(claims, key)
217218
jwt.decode(token, key)
218219

219220
def test_nbf_with_leeway(self, key):
220-
nbf = datetime.utcnow() + timedelta(seconds=5)
221+
nbf = utcnow() + timedelta(seconds=5)
221222

222223
claims = {
223224
"nbf": nbf,
@@ -229,7 +230,7 @@ def test_nbf_with_leeway(self, key):
229230
jwt.decode(token, key, options=options)
230231

231232
def test_nbf_in_future(self, key):
232-
nbf = datetime.utcnow() + timedelta(seconds=5)
233+
nbf = utcnow() + timedelta(seconds=5)
233234

234235
claims = {"nbf": nbf}
235236

@@ -239,7 +240,7 @@ def test_nbf_in_future(self, key):
239240
jwt.decode(token, key)
240241

241242
def test_nbf_skip(self, key):
242-
nbf = datetime.utcnow() + timedelta(seconds=5)
243+
nbf = utcnow() + timedelta(seconds=5)
243244

244245
claims = {"nbf": nbf}
245246

@@ -261,15 +262,15 @@ def test_exp_not_int(self, key):
261262
jwt.decode(token, key)
262263

263264
def test_exp_datetime(self, key):
264-
exp = datetime.utcnow() + timedelta(seconds=5)
265+
exp = utcnow() + timedelta(seconds=5)
265266

266267
claims = {"exp": exp}
267268

268269
token = jwt.encode(claims, key)
269270
jwt.decode(token, key)
270271

271272
def test_exp_with_leeway(self, key):
272-
exp = datetime.utcnow() - timedelta(seconds=5)
273+
exp = utcnow() - timedelta(seconds=5)
273274

274275
claims = {
275276
"exp": exp,
@@ -281,7 +282,7 @@ def test_exp_with_leeway(self, key):
281282
jwt.decode(token, key, options=options)
282283

283284
def test_exp_in_past(self, key):
284-
exp = datetime.utcnow() - timedelta(seconds=5)
285+
exp = utcnow() - timedelta(seconds=5)
285286

286287
claims = {"exp": exp}
287288

@@ -291,7 +292,7 @@ def test_exp_in_past(self, key):
291292
jwt.decode(token, key)
292293

293294
def test_exp_skip(self, key):
294-
exp = datetime.utcnow() - timedelta(seconds=5)
295+
exp = utcnow() - timedelta(seconds=5)
295296

296297
claims = {"exp": exp}
297298

@@ -504,8 +505,8 @@ def test_unverified_claims_object(self, claims, key):
504505
[
505506
("aud", "aud"),
506507
("ait", "ait"),
507-
("exp", datetime.utcnow() + timedelta(seconds=3600)),
508-
("nbf", datetime.utcnow() - timedelta(seconds=5)),
508+
("exp", utcnow() + timedelta(seconds=3600)),
509+
("nbf", utcnow() - timedelta(seconds=5)),
509510
("iss", "iss"),
510511
("sub", "sub"),
511512
("jti", "jti"),

0 commit comments

Comments
 (0)