gitscope
← marzneshin / v0.5.3 / app/utils/auth.py
https://dev.kronoz.win/r/marzneshin.git
app/utils/auth.py · Python
Blame Raw
 1from datetime import datetime, timedelta
 2from typing import Union
 3
 4import jwt
 5
 6from app.config import get_secret_key
 7from app.config.env import JWT_ACCESS_TOKEN_EXPIRE_MINUTES
 8
 9
10def create_admin_token(username: str, is_sudo=False) -> str:
11    data = {
12        "sub": username,
13        "access": "sudo" if is_sudo else "admin",
14        "iat": datetime.utcnow(),
15    }
16    if JWT_ACCESS_TOKEN_EXPIRE_MINUTES > 0:
17        expire = datetime.utcnow() + timedelta(
18            minutes=JWT_ACCESS_TOKEN_EXPIRE_MINUTES
19        )
20        data["exp"] = expire
21    encoded_jwt = jwt.encode(data, get_secret_key(), algorithm="HS256")
22    return encoded_jwt
23
24
25def get_admin_payload(token: str) -> Union[dict, None]:
26    try:
27        payload = jwt.decode(token, get_secret_key(), algorithms=["HS256"])
28    except jwt.InvalidTokenError:
29        return
30
31    username: str = payload.get("sub")
32    access: str = payload.get("access")
33    if not username or access not in ("admin", "sudo"):
34        return
35    try:
36        created_at = datetime.utcfromtimestamp(payload["iat"])
37    except KeyError:
38        created_at = None
39
40    return {
41        "username": username,
42        "is_sudo": access == "sudo",
43        "created_at": created_at,
44    }