Разработай RESTful API на Go для управления пользователями, реализовав следующие возможности:
-
CRUD операции для пользователей:
- GET /users – получение списка всех пользователей (только для авторизованных администраторов).
- GET /users/{id} – получение данных конкретного пользователя (доступно пользователю, которому принадлежат данные, или администратору).
- POST /users – регистрация нового пользователя.
- PUT /users/{id} – обновление данных существующего пользователя.
- DELETE /users/{id} – удаление пользователя.
-
Аутентификация:
- POST /auth/login – вход пользователя в систему. Клиент отправляет учетные данные (например, email и пароль), сервер проверяет их и возвращает токен (например, JWT).
- POST /auth/logout (опционально) – выход пользователя (если реализуете механизм «черного списка» или инвалидирования токенов).
-
Авторизация:
- Реализуй проверку доступа для защищенных эндпоинтов.
- Например, эндпоинт GET /users доступен только администраторам, а GET /users/{id} доступен либо владельцу, либо администратору.
- Для хранения ролей пользователей можно добавить поле
role(например,"admin"или"user") в модель пользователя.
-
Безопасное хранение паролей:
- Храни пароли в виде хэшированных значений (используй bcrypt или аналогичную библиотеку).
- Используй популярный роутер (например, Gin, Echo или Gorilla Mux).
- Реализуй обработчики для каждого эндпоинта, возвращающие корректные HTTP-статусы и JSON-ответы.
- Реализуй механизм аутентификации с помощью JWT:
- При успешном входе (POST /auth/login) сервер генерирует JWT-токен с полезной нагрузкой (например, id пользователя, роль, время жизни токена).
- Защищенные эндпоинты проверяют наличие и валидность JWT в заголовке Authorization.
- Создай middleware, который:
- Проверяет наличие токена.
- Декодирует и валидирует JWT.
- Извлекает информацию о пользователе и добавляет её в контекст запроса.
- На основании ролей (например, admin/user) разрешает или запрещает доступ к определённым ресурсам.
- Внедри логирование входящих запросов, ответов и ошибок (с использованием zap или logrus).
- Реализуй middleware для логирования, чтобы логировались метод, URL, статус и время выполнения.
- Создай централизованную обработку ошибок:
- Определи общий формат ответа с ошибкой (например, JSON с полями
errorиmessage). - Обрабатывай ошибки в middleware или через общий механизм обработки в каждом обработчике.
- Определи общий формат ответа с ошибкой (например, JSON с полями
- Читай настройки из переменных окружения или конфигурационного файла (с использованием viper).
- Настрой параметры для режима разработки и production (например, порт сервера, секрет для JWT, режим логирования).
- Опиши эндпоинты, их параметры, пример запросов и ответов в README.
- (Опционально) сгенерируй документацию через Swagger/OpenAPI.
- Подготовь Dockerfile для сборки и запуска приложения.
- Если используешь внешнюю базу данных, подготовь docker-compose.yml, включив сервисы для приложения, БД и nginx (если нужен reverse proxy и обслуживание статических файлов).