Comments 3
if (not expire) or (expire_time < datetime.now(timezone.utc)): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Токен истек')
Проверка лишняя. jwt.decode
уже проверяет срок жизни токена. Первый except JWTError
это отловит.
from time import sleep
from datetime import datetime, timezone, timedelta
from jose import jwt
def create_access_token(data: dict) -> str:
to_encode = data.copy()
expire = datetime.now(timezone.utc) + timedelta(seconds=3)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, "mysecret")
if __name__ == "__main__":
token = create_access_token({"some": "data"})
print(token)
sleep(5)
print(jwt.decode(token, algorithms=["HS256"], key="mysecret"))
>>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoiZGF0YSIsImV4cCI6MTcyMTMwMTQ5MH0.KjLGf3chNy5pvx-vsYY_nKbSMNML0-LTR6PfD8dAXJA
>>Traceback (most recent call last):
>>...
>>jose.exceptions.ExpiredSignatureError: Signature has expired.
Очень крутая статья по аутентификации. Было бы славно подробнее раскрыть различные способы передачи токена, например, Bearer. Есть ли простой способ сделать эндпоинты защищенными в swagger'е с использованием вашего метода аутентификации?
Sign up to leave a comment.
Создание собственного API на Python (FastAPI): Авторизация, Аутентификация и роли пользователей