Skip to content

Commit 258d7ba

Browse files
Use timezone package as Python 3.5+ is required (jpadilla#694)
* Use timezone package as Python 3.5+ is required This method is deprecated: https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow Replaced with: https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow using: https://docs.python.org/3/library/datetime.html#datetime.timezone.utc which seems to indicate this was added in Python 3.2 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent a988e1a commit 258d7ba

File tree

4 files changed

+15
-14
lines changed

4 files changed

+15
-14
lines changed

docs/usage.rst

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ datetime, which will be converted into an int. For example:
119119
.. code-block:: python
120120
121121
jwt.encode({"exp": 1371720939}, "secret")
122-
jwt.encode({"exp": datetime.utcnow()}, "secret")
122+
jwt.encode({"exp": datetime.now(tz=timezone.utc)}, "secret")
123123
124124
Expiration time is automatically verified in `jwt.decode()` and raises
125125
`jwt.ExpiredSignatureError` if the expiration time is in the past:
@@ -133,7 +133,7 @@ Expiration time is automatically verified in `jwt.decode()` and raises
133133
...
134134
135135
Expiration time will be compared to the current UTC time (as given by
136-
`timegm(datetime.utcnow().utctimetuple())`), so be sure to use a UTC timestamp
136+
`timegm(datetime.now(tz=timezone.utc).utctimetuple())`), so be sure to use a UTC timestamp
137137
or datetime in encoding.
138138

139139
You can turn off expiration time verification with the `verify_exp` parameter in the options argument.
@@ -147,7 +147,8 @@ you can set a leeway of 10 seconds in order to have some margin:
147147
.. code-block:: python
148148
149149
jwt_payload = jwt.encode(
150-
{"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30)}, "secret"
150+
{"exp": datetime.datetime.now(tz=timezone.utc) + datetime.timedelta(seconds=30)},
151+
"secret",
151152
)
152153
153154
time.sleep(32)
@@ -181,7 +182,7 @@ The `nbf` claim works similarly to the `exp` claim above.
181182
.. code-block:: python
182183
183184
jwt.encode({"nbf": 1371720939}, "secret")
184-
jwt.encode({"nbf": datetime.utcnow()}, "secret")
185+
jwt.encode({"nbf": datetime.now(tz=timezone.utc)}, "secret")
185186
186187
Issuer Claim (iss)
187188
~~~~~~~~~~~~~~~~~~
@@ -259,7 +260,7 @@ Issued At Claim (iat)
259260
.. code-block:: python
260261
261262
jwt.encode({"iat": 1371720939}, "secret")
262-
jwt.encode({"iat": datetime.utcnow()}, "secret")
263+
jwt.encode({"iat": datetime.now(tz=timezone.utc)}, "secret")
263264
264265
Requiring Presence of Claims
265266
----------------------------

jwt/api_jwt.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
from calendar import timegm
33
from collections.abc import Iterable, Mapping
4-
from datetime import datetime, timedelta
4+
from datetime import datetime, timedelta, timezone
55
from typing import Any, Dict, List, Optional, Type, Union
66

77
from . import api_jws
@@ -133,7 +133,7 @@ def _validate_claims(self, payload, options, audience, issuer, leeway):
133133

134134
self._validate_required_claims(payload, options)
135135

136-
now = timegm(datetime.utcnow().utctimetuple())
136+
now = timegm(datetime.now(tz=timezone.utc).utctimetuple())
137137

138138
if "iat" in payload and options["verify_iat"]:
139139
self._validate_iat(payload, now, leeway)

tests/test_api_jwt.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import time
33
from calendar import timegm
4-
from datetime import datetime, timedelta
4+
from datetime import datetime, timedelta, timezone
55
from decimal import Decimal
66

77
import pytest
@@ -252,7 +252,7 @@ def test_decode_raises_exception_if_aud_is_none(self, jwt):
252252

253253
def test_encode_datetime(self, jwt):
254254
secret = "secret"
255-
current_datetime = datetime.utcnow()
255+
current_datetime = datetime.now(tz=timezone.utc)
256256
payload = {
257257
"exp": current_datetime,
258258
"iat": current_datetime,
@@ -499,7 +499,7 @@ def test_skip_check_audience(self, jwt):
499499
def test_skip_check_exp(self, jwt):
500500
payload = {
501501
"some": "payload",
502-
"exp": datetime.utcnow() - timedelta(days=1),
502+
"exp": datetime.now(tz=timezone.utc) - timedelta(days=1),
503503
}
504504
token = jwt.encode(payload, "secret")
505505
jwt.decode(
@@ -576,7 +576,7 @@ def test_skip_check_signature(self, jwt):
576576
def test_skip_check_iat(self, jwt):
577577
payload = {
578578
"some": "payload",
579-
"iat": datetime.utcnow() + timedelta(days=1),
579+
"iat": datetime.now(tz=timezone.utc) + timedelta(days=1),
580580
}
581581
token = jwt.encode(payload, "secret")
582582
jwt.decode(
@@ -589,7 +589,7 @@ def test_skip_check_iat(self, jwt):
589589
def test_skip_check_nbf(self, jwt):
590590
payload = {
591591
"some": "payload",
592-
"nbf": datetime.utcnow() + timedelta(days=1),
592+
"nbf": datetime.now(tz=timezone.utc) + timedelta(days=1),
593593
}
594594
token = jwt.encode(payload, "secret")
595595
jwt.decode(

tests/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import os
22
from calendar import timegm
3-
from datetime import datetime
3+
from datetime import datetime, timezone
44

55
import pytest
66

77
from jwt.algorithms import has_crypto
88

99

1010
def utc_timestamp():
11-
return timegm(datetime.utcnow().utctimetuple())
11+
return timegm(datetime.now(tz=timezone.utc).utctimetuple())
1212

1313

1414
def key_path(key_name):

0 commit comments

Comments
 (0)