blitz_api/app/auth/auth_handler.py

67 lines
1.8 KiB
Python
Raw Permalink Normal View History

import asyncio
import os
2021-06-10 21:13:26 +02:00
import time
from typing import Dict
import jwt
from decouple import config
from loguru import logger
2021-06-10 21:13:26 +02:00
JWT_SECRET = config("secret")
JWT_ALGORITHM = config("algorithm")
JWT_EXPIRY_TIME = config("jwt_expiry_time", default=300, cast=int)
2021-06-10 21:13:26 +02:00
2022-03-23 21:03:50 +01:00
def sign_jwt() -> Dict[str, str]:
payload = {
"user_id": "admin",
"expires": int(round(time.time() * 1000) + JWT_EXPIRY_TIME),
}
2021-06-10 21:13:26 +02:00
token = jwt.encode(payload, JWT_SECRET, algorithm=JWT_ALGORITHM)
return token
2021-06-10 21:13:26 +02:00
def decodeJWT(token: str) -> dict:
try:
2021-09-05 08:56:53 +02:00
decoded_token = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
return decoded_token if decoded_token["expires"] >= time.time() * 1000 else None
except Exception as e:
logger.warning(f"Unable to decode jwt_token {e}")
2021-06-10 21:13:26 +02:00
return {}
def handle_local_cookie():
remove_local_cookie()
blitz_path = os.path.join(os.path.expanduser("~"), ".blitz_api")
full_cookie_file_path = os.path.join(blitz_path, ".cookie")
enabled = config("enable_local_cookie_auth", default=False, cast=bool)
if not os.path.exists(blitz_path):
os.makedirs(blitz_path)
if enabled:
f = open(full_cookie_file_path, "w")
f.write(sign_jwt())
f.close()
def remove_local_cookie():
full_cookie_file_path = os.path.join(
os.path.expanduser("~"), ".blitz_api", ".cookie"
)
if os.path.exists(path=full_cookie_file_path):
os.remove(full_cookie_file_path)
def register_cookie_updater():
# We need to update the cookie file once the cookie is expired
async def _cookie_updater():
while True:
await asyncio.sleep(JWT_EXPIRY_TIME - 10)
handle_local_cookie()
loop = asyncio.get_event_loop()
loop.create_task(_cookie_updater())