Как реализована авторизация на проекте
Что проверяют
Понимаете ли вы разницу между аутентификацией и авторизацией и как обе устроены в вашем Python-проекте на уровне кода: где проверяется личность, где права, где лежат секреты. Следом обычно спрашивают, как отозвать токен и как хранятся пароли.
Как отвечать
Начните со схемы своего проекта, а потом покажите, что знаете альтернативы:
- сессии: классика Django.
django.contrib.auth, сессия в базе или Redis, cookie с флагамиHttpOnly,Secure,SameSite, встроенная защита от CSRF. Выход действительно завершает сессию на сервере; - токены: FastAPI или DRF с JWT. В FastAPI это зависимость через
Depends, схемаOAuth2PasswordBearerдостаёт токен из заголовка, а PyJWT проверяет его:jwt.decode(token, key, algorithms=["HS256"]). Access-токен живёт минуты, refresh-токен дольше и хранится с возможностью отзыва; - внешний провайдер: OAuth 2.0 это делегирование доступа, а вход через внешнюю учётку даёт OpenID Connect поверх него. Обмен кода и проверку
stateотдают библиотеке вроде Authlib, свой разбор протокола не пишут; - права: в Django
has_permи группы, в DRF классыpermission_classes, в FastAPI зависимости, проверяющие роль или владельца объекта. Проверка, что объект принадлежит пользователю, нужна на каждом эндпоинте с идентификатором; - пароли: хешируются медленной функцией. В Django по умолчанию PBKDF2, рекомендуется Argon2; вне Django берут
argon2-cffiилиbcrypt.
Ключи подписи хранятся в переменных окружения или менеджере секретов, а не в коде.
Где спотыкаются
Называют OAuth 2.0 протоколом аутентификации. Для входа нужен OpenID Connect с id_token, голый OAuth выдаёт только доступ.
Кладут в payload JWT чувствительные данные и считают токен зашифрованным. По умолчанию он только подписан, содержимое любой прочитает, раскодировав Base64url.
Пишут datetime.utcnow() для exp. С Python 3.12 метод помечен устаревшим, нужно datetime.now(timezone.utc).