Учебный full-stack проект для изучения авторизации, роутинга и взаимодействия фронтенда с бэкендом.
Стек:
- Backend — Python · FastAPI · JWT-like токены · HttpOnly cookies
- Frontend — React 19 · TypeScript · Vite · Zustand · TanStack Query
mini-project/
├── backend/ # FastAPI — порт 8000
│ ├── main.py
│ ├── requirements.txt
│ └── Dockerfile
└── frontend/ # React + Vite — порт 5173
├── src/
│ ├── pages/ # LoginPage, ProfilePage, AdminPage
│ ├── stores/ # Zustand: authStore
│ ├── api/ # axios-клиент, auth.ts, users.ts
│ └── hooks/ # useSessionRestore
├── package.json
└── Dockerfile
Самый простой способ запустить всё одной командой. Docker поднимет бэкенд и фронтенд вместе, настроит сеть между ними и включит hot-reload.
- Docker Desktop (включает docker compose)
docker compose up --buildФлаг --build пересобирает образы при каждом запуске — это нужно, если вы меняли Dockerfile или package.json. Для последующих запусков без изменений можно использовать просто docker compose up.
После запуска:
| Сервис | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend | http://localhost:8000 |
| API docs | http://localhost:8000/docs |
| Логин | Пароль | Роль |
|---|---|---|
admin |
admin123 |
admin |
alice |
alice123 |
user |
bob |
bob123 |
user |
⚠️ Данные хранятся в памяти — при перезапуске сбрасываются. Это нормально для учёбы.
docker compose downУдобно для разработки, особенно если хотите полноценную поддержку IDE.
cd backendСоздание виртуального окружения:
python -m venv venvpython -m venv venv создаёт изолированную папку venv/ внутри проекта со своей копией Python и pip. Это нужно, чтобы зависимости проекта не конфликтовали с другими проектами на вашем компьютере — у каждого проекта своя "песочница".
Активация окружения:
# macOS / Linux
source venv/bin/activate
# Windows
venv\Scripts\activateПосле активации в начале строки терминала появится (venv) — это значит, что теперь python и pip работают внутри изолированного окружения, а не глобально. Все пакеты, установленные через pip install, попадут только в эту папку.
Установка зависимостей и запуск:
pip install -r requirements.txt
uvicorn main:app --reloadБэкенд будет доступен на http://localhost:8000
cd frontendДля управления версиями Node.js рекомендуется использовать nvm — это позволяет легко переключаться между версиями Node в разных проектах.
Установка nvm:
# macOS / Linux
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashПосле установки перезапустите терминал, затем:
nvm install 20 # установить Node.js 20 LTS
nvm use 20 # переключиться на эту версиюУстановка зависимостей и запуск:
npm install
npm run devФронтенд будет доступен на http://localhost:5173
Чтобы работал переход по коду (F12 / Ctrl+Click / Cmd+Click), нужна правильная настройка TypeScript.
- Установите расширение ESLint и TypeScript и JavaScript Language Features (встроено в VS Code)
- Откройте папку
frontend/как корень проекта в VS Code (важно — именноfrontend/, там лежитtsconfig.json) - Убедитесь, что установлены зависимости:
npm install
После этого VS Code подхватит tsconfig.json и Go to Definition будет работать для всех .ts и .tsx файлов.
💡 Если переход не работает — откройте любой
.tsxфайл и нажмитеCtrl+Shift+P→ "TypeScript: Restart TS Server"
| Метод | Путь | Доступ | Описание |
|---|---|---|---|
POST |
/api/auth/login |
Все | Логин, возвращает access_token |
POST |
/api/auth/refresh |
Все | Обновить токен через cookie |
POST |
/api/auth/logout |
Авторизованные | Выйти из аккаунта |
GET |
/api/users/me |
Авторизованные | Текущий пользователь |
GET |
/api/users |
Только admin | Список всех пользователей |
POST |
/api/users |
Только admin | Создать пользователя |
DELETE |
/api/users/{username} |
Только admin | Удалить пользователя |
Интерактивная документация: http://localhost:8000/docs
- Access + Refresh токены — как работает двухтокенная авторизация
- HttpOnly cookie — почему refresh_token нельзя украсть через JS
- Zustand — простое глобальное состояние (authStore)
- TanStack Query — кэширование и синхронизация серверных данных
- Роутинг вручную — гарды без react-router, через useState
- FastAPI — декларативные эндпоинты, Depends, Pydantic-схемы