2021-06-28 09:08:09 +00:00
|
|
|
from datetime import datetime
|
2022-09-17 18:12:14 +00:00
|
|
|
|
2021-06-28 09:08:09 +00:00
|
|
|
import jwt
|
2022-09-17 18:12:14 +00:00
|
|
|
|
2022-10-31 18:38:41 +00:00
|
|
|
from validations.auth import TokenPayload
|
2021-06-28 09:08:09 +00:00
|
|
|
from settings import JWT_ALGORITHM, JWT_SECRET_KEY
|
|
|
|
|
|
|
|
|
2022-07-21 11:58:50 +00:00
|
|
|
class JWTCodec:
|
2022-09-03 10:50:14 +00:00
|
|
|
@staticmethod
|
2022-10-31 18:38:41 +00:00
|
|
|
def encode(user_id: int, exp: datetime) -> str:
|
2022-09-03 10:50:14 +00:00
|
|
|
payload = {
|
2022-10-31 18:38:41 +00:00
|
|
|
"user_id": user_id,
|
2022-09-17 18:12:14 +00:00
|
|
|
# "user_email": user.email, # less secure
|
|
|
|
# "device": device, # no use cases
|
2022-09-03 10:50:14 +00:00
|
|
|
"exp": exp,
|
2022-10-31 18:02:06 +00:00
|
|
|
"iat": datetime.utcnow()
|
2022-09-03 10:50:14 +00:00
|
|
|
}
|
2022-10-23 09:33:28 +00:00
|
|
|
try:
|
2022-10-31 18:38:41 +00:00
|
|
|
return jwt.encode(payload, JWT_SECRET_KEY, JWT_ALGORITHM)
|
2022-10-23 09:33:28 +00:00
|
|
|
except Exception as e:
|
|
|
|
print('[jwtcodec] JWT encode error %r' % e)
|
2021-06-28 09:08:09 +00:00
|
|
|
|
2022-09-03 10:50:14 +00:00
|
|
|
@staticmethod
|
2022-09-17 18:12:14 +00:00
|
|
|
def decode(token: str, verify_exp: bool = True) -> TokenPayload:
|
2022-10-23 09:33:28 +00:00
|
|
|
try:
|
|
|
|
payload = jwt.decode(
|
|
|
|
token,
|
|
|
|
key=JWT_SECRET_KEY,
|
2022-10-31 19:53:48 +00:00
|
|
|
options={
|
|
|
|
"verify_exp": verify_exp,
|
|
|
|
"verify_signature": False
|
|
|
|
},
|
2022-10-23 09:33:28 +00:00
|
|
|
algorithms=[JWT_ALGORITHM],
|
|
|
|
)
|
2022-10-31 18:38:41 +00:00
|
|
|
r = TokenPayload(**payload)
|
|
|
|
print('[jwtcodec] debug payload %r' % r)
|
|
|
|
return r
|
2022-10-23 09:33:28 +00:00
|
|
|
except Exception as e:
|
|
|
|
print('[jwtcodec] JWT decode error %r' % e)
|