Skip to content

Commit efa7dd1

Browse files
author
Landon Gilbert-Bland
committed
Fix error in 4.0.0 branch where refresh expires time was always used
1 parent 5244635 commit efa7dd1

File tree

4 files changed

+31
-8
lines changed

4 files changed

+31
-8
lines changed

flask_jwt_extended/jwt_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,10 @@ def _encode_jwt_from_config(
473473
claim_overrides.update(claims)
474474

475475
if expires_delta is None:
476-
expires_delta = config.refresh_expires
476+
if token_type == "access":
477+
expires_delta = config.access_expires
478+
else:
479+
expires_delta = config.refresh_expires
477480

478481
return _encode_jwt(
479482
algorithm=config.algorithm,

flask_jwt_extended/tokens.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import datetime
21
import uuid
3-
from calendar import timegm
2+
from datetime import datetime
3+
from datetime import timedelta
4+
from datetime import timezone
45

56
import jwt
67
from werkzeug.security import safe_str_cmp
@@ -23,10 +24,10 @@ def _encode_jwt(
2324
secret,
2425
token_type,
2526
):
26-
now = datetime.datetime.utcnow()
27+
now = datetime.now(timezone.utc)
2728

28-
if isinstance(fresh, datetime.timedelta):
29-
fresh = timegm((now + fresh).utctimetuple())
29+
if isinstance(fresh, timedelta):
30+
fresh = datetime.timestamp(now + fresh)
3031

3132
token_data = {
3233
"fresh": fresh,

flask_jwt_extended/view_decorators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from calendar import timegm
21
from datetime import datetime
2+
from datetime import timezone
33
from functools import wraps
44
from re import split
55

@@ -28,7 +28,7 @@ def _verify_token_is_fresh(jwt_header, jwt_data):
2828
if not fresh:
2929
raise FreshTokenRequired("Fresh token required", jwt_header, jwt_data)
3030
else:
31-
now = timegm(datetime.utcnow().utctimetuple())
31+
now = datetime.timestamp(datetime.now(timezone.utc))
3232
if fresh < now:
3333
raise FreshTokenRequired("Fresh token required", jwt_header, jwt_data)
3434

tests/test_decode_tokens.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime
22
from datetime import timedelta
3+
from datetime import timezone
34

45
import pytest
56
from dateutil.relativedelta import relativedelta
@@ -289,3 +290,21 @@ def test_jwt_headers(app):
289290
refresh_token = create_refresh_token("username", additional_headers=jwt_header)
290291
assert get_unverified_jwt_headers(access_token)["foo"] == "bar"
291292
assert get_unverified_jwt_headers(refresh_token)["foo"] == "bar"
293+
294+
295+
def test_token_expires_time(app):
296+
app.config["JWT_ACCESS_TOKEN_EXPIRES"] = timedelta(hours=1)
297+
app.config["JWT_REFRESH_TOKEN_EXPIRES"] = timedelta(hours=2)
298+
299+
now_timestamp = datetime.timestamp(datetime.now(timezone.utc))
300+
301+
with app.test_request_context():
302+
access_token = create_access_token("username")
303+
refresh_token = create_refresh_token("username")
304+
access_timestamp = decode_token(access_token)["exp"]
305+
refresh_timestamp = decode_token(refresh_token)["exp"]
306+
307+
# < 2 for a little bit of leeway from when we calculated now vs when
308+
# the tokens are created
309+
assert (access_timestamp - (now_timestamp + 3600)) < 2
310+
assert (refresh_timestamp - (now_timestamp + 7200)) < 2

0 commit comments

Comments
 (0)