Pull to refresh

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'е с использованием вашего метода аутентификации?

Чтобы эндпоинты показывались как защищенные, можно заменить get_access_token на

cookie_scheme = APIKeyCookie(name="users_access_token", auto_error=True)

А затем прокинуть как зависимость в get_current_user:

token: str = Depends(cookie_scheme),

Sign up to leave a comment.

Articles