Приложение на FastAPI (концепция не привязана к фреймворку) демонстрирует регистрацию, вход/выход и работу через сессионные куки и JWT access + refresh. Стек: async SQLAlchemy, PostgreSQL 17, uvicorn.
- Таблицы
users(id, name, password_hash) иsessions(hash токена, срок действия) в PostgreSQL. - Сессионная авторизация с http-only cookie, хранением хэша токена и очисткой просроченных сессий.
- JWT авторизация с access токенами на
pyjwt; refresh — непрозрачные строки, в БД хранится только SHA-256 хэш. Оба токена дополнительно кладутся в куки (access_token,refresh_token). - Асинхронный стек: FastAPI, SQLAlchemy 2.x + asyncpg, uvicorn.
- Docker Compose поднимает PostgreSQL 17 и API.
- Установите
uv(черезpip install uvили скрипт https://astral.sh/uv). - Поднимите Postgres 17 (по умолчанию пользователь/пароль/база —
postgres). - Создайте
.envс нужными значениями (см. список переменных ниже). По умолчаниюDATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:7432/postgres.
uv sync
docker compose up -d db # поднимет только Postgres
uv run uvicorn auth_app.main:app --reload --host 0.0.0.0 --port 8000API будет на http://localhost:8000, swagger UI — /docs.
Фронтенд-демо доступно на корне (/) и ходит к API с этого же хоста.
Compose поднимет API и PostgreSQL в одном docker compose up (API смотрит на хост db через переменную окружения, прокидываемую внутри композа).
docker compose up --buildПосле старта API доступен на http://localhost:8000, UI swagger — /docs, статический демо-фронт — /.
DATABASE_URL(defaultpostgresql+asyncpg://postgres:postgres@localhost:7432/postgres)JWT_SECRET_KEY— секрет для подписи JWTACCESS_TOKEN_EXPIRES_MINUTES(по умолчанию 15)REFRESH_TOKEN_EXPIRES_MINUTES(по умолчанию 43200, то есть 30 дней)SESSION_TTL_MINUTES(по умолчанию 1440)SESSION_EXTEND_MINUTES(rolling продление, по умолчанию 10080 = 7 дней)SESSION_ABSOLUTE_TIMEOUT_DAYS(жесткий предел жизни сессии, по умолчанию 30 дней)SESSION_ROLLING_INTERVAL_MINUTES(интервал проверки для продления, по умолчанию 10)SESSION_COOKIE_NAME,SESSION_COOKIE_SECURE,SESSION_COOKIE_DOMAINACCESS_COOKIE_NAME,REFRESH_COOKIE_NAME(по умолчаниюaccess_token/refresh_token)
POST /auth/register— регистрацияPOST /auth/login/session— логин, установка сессионной кукиPOST /auth/logout/session— логаут, очистка куки и записи в БДGET /auth/me/session— профиль по сессииPOST /auth/login/jwt— логин, выдача пары access/refresh (refresh записывается в БД, хранится хэш)POST /auth/token/refresh— обновление пары по refresh (старый refresh гасится и заменяется новым)GET /auth/me/jwt— профиль по access токену