Вход и JWT access token
Уроки курсаВход и JWT access token
Токен для проверенной учётной записи
Roomly выдаёт временный токен для уже проверенной учётной записи. Токен должен содержать её постоянный token_subject и срок действия, быть подписан секретным ключом сервиса и не включать пароль или хеш пароля.
Реализуйте выпуск такого токена. Проверка пароля уже выполнена до вызова вашей функции и в эту задачу не входит. Содержимое JWT можно прочитать без секретного ключа; подпись позволяет проверить его подлинность, но не шифрует данные.
Что уже дано
Это отдельный учебный стенд в одном видимом файле. В нём уже есть импорты, объект FastAPI app, серверные данные app.state.verified_user, учебный ключ app.state.secret_key и готовый POST /__lab__/token. Маршрут не принимает учётную запись или ключ из HTTP-запроса: он вызывает вашу функцию с серверными значениями и возвращает access_token и token_type. Данные представляют уже проверенную учётную запись; здесь нет проверки пароля, регистрации или базы данных. Не переносите этот служебный маршрут и учебный ключ в публикуемый Roomly. Полный вход с настоящей проверкой пароля остаётся в локальном проекте урока.
Служебный переходник запускается перед видимым файлом, но не создаёт app и не реализует выпуск токена. Он вызывает настоящий TestClient в процессе приложения, передаёт ответы скрытой проверке и позволяет ей вызывать вашу функцию с другими доверенными аргументами. Писать переходник не нужно.
Что нужно сделать
Дополните только create_access_token(token_subject: str, secret_key: str) -> str. Аргумент token_subject — постоянная случайная строка существующей проверенной учётной записи, не её числовой id и не email; secret_key — непустой доверенный ключ сервера. Функция должна работать с переданными значениями, а не брать их из глобального учебного примера.
Верните строку JWT, подписанную переданным ключом через PyJWT с алгоритмом HS256. Payload содержит ровно два поля: sub, равный переданному token_subject, и exp, момент истечения через 30 минут от текущего времени UTC. В токене exp представлен числовым Unix timestamp; datetime при передаче в PyJWT также допустим. Пароль, хеш и секрет в payload не входят. Сохраните готовый маршрут и его ответ; новую проверку входа писать не требуется.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. После выполнения файла проверка обращается к верхнеуровневым app и create_access_token. Она отправляет запросы к app через TestClient и вызывает функцию с обычными строковыми аргументами. Результат функции — строка JWT; результат готового POST — HTTP 200 с JSON, содержащим access_token и token_type="bearer". Запускать Uvicorn, pytest или сеть не требуется.
Например, для token_subject="a" * 64 и учебного ключа из шаблона вызов POST /__lab__/token без тела возвращает 200. В access_token находится подписанная строка; при чтении её payload значение sub равно строке из 64 букв a, а exp соответствует времени выпуска плюс 30 минут. Сам токен и точный timestamp меняются со временем, поэтому фиксированная строка ответа здесь не задаётся.
