Advertisement
Platitude

Untitled

Aug 14th, 2022
991
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.61 KB | None | 0 0
  1. import time
  2. from datetime import datetime, timedelta
  3.  
  4. from fastapi import HTTPException
  5. from icecream import ic
  6. from jose import jwt
  7. from .settings import settings
  8.  
  9. ALGORITHM = "HS256"
  10.  
  11.  
  12. def create_token(*, data: dict, type_token: str):
  13.     """
  14.    Создание токена
  15.    :param data: данные пользователя
  16.    :param type_token: тип создаваемого токена, "access" или "refresh"
  17.    :return: сгенерированный токен пользователя
  18.    """
  19.     expires_delta = timedelta(
  20.         minutes=settings.jwt_access_expiration if type_token == "access" else settings.jwt_refresh_expiration)
  21.     if expires_delta:
  22.         expire = datetime.utcnow() + expires_delta
  23.     else:
  24.         expire = datetime.utcnow() + timedelta(minutes=15)
  25.     payload = {
  26.         "user_id": data.get("user_id"),
  27.         "email": data.get("email"),
  28.         "exp": expire,
  29.         "iat": datetime.utcnow(),
  30.         "sub": "access" if type_token == "access" else "refresh"
  31.     }
  32.     if type_token == "access":
  33.         access_encoded_jwt = jwt.encode(payload, settings.jwt_secret, settings.jwt_algorithm)
  34.         return access_encoded_jwt
  35.     else:
  36.         refresh_token_jwt = jwt.encode(payload, settings.jwt_secret, settings.jwt_algorithm)
  37.         return refresh_token_jwt
  38.  
  39.  
  40. def decode_token(token: str):
  41.     """
  42.    Декодирование токена пользователя
  43.    :param token: токен пользователя
  44.    :return: payload если время жизни токена не вышло
  45.    """
  46.     try:
  47.         payload = jwt.decode(token, settings.jwt_secret, algorithms=settings.jwt_algorithm)
  48.         return payload
  49.     except jwt.ExpiredSignatureError:
  50.         raise HTTPException(status_code=401, detail="Срок действия токена истек")
  51.     except jwt.JWTError:
  52.         raise HTTPException(status_code=401, detail="Недействительный токен")
  53.  
  54.  
  55. def refresh_token(expired_token):
  56.     """
  57.    Обновление токена
  58.    :param expired_token: рефреш токен пользователя
  59.    :return: новую пару токенов
  60.    """
  61.     try:
  62.         payload = decode_token(expired_token)
  63.         new_access_token = create_token(data=payload, type_token="access")
  64.         new_refresh_token = create_token(data=payload, type_token="refresh")
  65.         return {"access_token": new_access_token,
  66.                 "refresh_token": new_refresh_token}
  67.     except jwt.JWTError:
  68.         raise HTTPException(status_code=401, detail="Недействительный токен")
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement