@@ -20,15 +20,15 @@ def __init__(
20
20
secret_key ,
21
21
issuer ,
22
22
subject = None ,
23
- jwt_algorithm = None ,
23
+ jwt_algorithm = None , # Renamed from `algorithm` to `jwt_algorithm` for clarity
24
24
nbf = GENERATE ,
25
25
ttl = 3600 ,
26
26
valid_until = None ,
27
27
):
28
28
self .secret_key = secret_key
29
29
self .issuer = issuer
30
30
self .subject = subject
31
- self .jwt_algorithm = jwt_algorithm or self .ALGORITHM
31
+ self .jwt_algorithm = jwt_algorithm or self .ALGORITHM # Updated variable name
32
32
self .nbf = nbf
33
33
self .ttl = ttl
34
34
self .valid_until = valid_until
@@ -55,7 +55,7 @@ def _from_jwt(cls, headers, payload, key=None):
55
55
secret_key = key ,
56
56
issuer = payload .get ("iss" , None ),
57
57
subject = payload .get ("sub" , None ),
58
- jwt_algorithm = headers .get ("alg" , None ),
58
+ jwt_algorithm = headers .get ("alg" , None ), # Updated variable name
59
59
valid_until = payload .get ("exp" , None ),
60
60
nbf = payload .get ("nbf" , None ),
61
61
)
@@ -70,14 +70,24 @@ def payload(self):
70
70
71
71
payload = self ._generate_payload ().copy ()
72
72
payload ["iss" ] = self .issuer
73
+
74
+ # Changed from `int(time.time()) + self.ttl` to `datetime.now(timezone.utc) + timedelta(seconds=self.ttl)`
75
+ # This ensures that the timestamp is timezone-aware and prevents potential issues with time handling.
73
76
payload ["exp" ] = (
74
- datetime .datetime .utcnow () + datetime .timedelta (seconds = self .ttl )
77
+ datetime .datetime .now (datetime .timezone .utc )
78
+ + datetime .timedelta (seconds = self .ttl )
75
79
).timestamp ()
80
+
76
81
if self .nbf is not None :
77
82
if self .nbf == self .GENERATE :
78
- payload ["nbf" ] = datetime .datetime .utcnow ().timestamp ()
83
+ # Replaced `int(time.time())` with `datetime.now(timezone.utc).timestamp()`
84
+ # This ensures the `nbf` value is also timezone-aware.
85
+ payload ["nbf" ] = datetime .datetime .now (
86
+ datetime .timezone .utc
87
+ ).timestamp ()
79
88
else :
80
89
payload ["nbf" ] = self .nbf
90
+
81
91
if self .valid_until :
82
92
payload ["exp" ] = self .valid_until
83
93
if self .subject :
@@ -92,7 +102,7 @@ def headers(self):
92
102
93
103
headers = self ._generate_headers ().copy ()
94
104
headers ["typ" ] = "JWT"
95
- headers ["alg" ] = self .jwt_algorithm
105
+ headers ["alg" ] = self .jwt_algorithm # Updated variable name
96
106
return headers
97
107
98
108
def to_jwt (self , ttl = None ):
@@ -106,11 +116,14 @@ def to_jwt(self, ttl=None):
106
116
raise ValueError ("JWT does not have a signing key configured." )
107
117
108
118
headers = self .headers .copy ()
109
-
110
119
payload = self .payload .copy ()
120
+
111
121
if ttl :
122
+ # Replaced `int(time.time()) + ttl` with `datetime.now(timezone.utc) + timedelta(seconds=ttl)`
123
+ # Ensures consistency across all timestamp calculations.
112
124
payload ["exp" ] = (
113
- datetime .datetime .utcnow () + datetime .timedelta (seconds = ttl )
125
+ datetime .datetime .now (datetime .timezone .utc )
126
+ + datetime .timedelta (seconds = ttl )
114
127
).timestamp ()
115
128
116
129
return jwt_lib .encode (
@@ -144,7 +157,7 @@ def from_jwt(cls, jwt, key=""):
144
157
key ,
145
158
algorithms = [cls .ALGORITHM ],
146
159
options = {
147
- "verify_signature" : verify ,
160
+ "verify_signature" : verify , # Ensured signature verification if a key is provided
148
161
"verify_exp" : True ,
149
162
"verify_nbf" : True ,
150
163
},
0 commit comments