REST интерфейс и аутентификация Веб-приложений
REST
Описание
REST (Representational State Transfer) - это стиль архитектуры программного обеспечения для распределенных систем, таких как веб-приложения. REST определяет набор принципов, которые ориентированы на создание масштабируемых, гибких и легко поддерживаемых веб-сервисов. Он использует стандартные протоколы HTTP для связи между клиентом и сервером.
Основные принципы REST включают в себя:
Ресурсы: Все данные в системе рассматриваются как ресурсы, которые идентифицируются уникальными URI (Uniform Resource Identifiers).
HTTP методы: REST использует HTTP методы (GET, POST, PUT, DELETE) для выполнения операций над ресурсами. Например, GET используется для получения ресурсов, POST - для создания новых ресурсов, PUT - для обновления существующих ресурсов, DELETE - для удаления ресурсов.
Представление ресурсов: Ресурсы могут иметь различные представления, такие как JSON, XML, HTML и т. д. Клиент может указывать предпочтительное представление при запросе.
Без состояния (Stateless): Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для обработки запроса. Сервер не должен хранить состояние между запросами от одного клиента.
Кеширование: Клиенты могут кешировать ответы сервера для улучшения производительности.
Единообразие интерфейса: Интерфейс должен быть однообразным для всех ресурсов. Это упрощает использование и понимание API.
RESTful веб-сервисы обычно позволяют клиентам выполнять CRUD операции (Create, Read, Update, Delete) над ресурсами через HTTP протокол. Это делает их универсальными и удобными для использования различными клиентами, такими как веб-браузеры, мобильные приложения и другие веб-сервисы.
CRUD
Описание
Интерфейс CRUD (Create, Read, Update, Delete) является стандартом веб-разработки для управления данными. Вот краткое описание каждого из его компонентов:
- Create (Создание):
- Форма для ввода новых данных.
- Обычно содержит поля для заполнения, кнопку “Отправить” или “Создать”, которая отправляет данные на сервер для сохранения.
- После успешного создания записи может отобразить сообщение об успешном создании или перенаправить пользователя на страницу с подробностями новой записи.
- HTTP метод: POST
- Когда пользователь создает новую запись через интерфейс, данные отправляются на сервер с помощью запроса POST. Этот запрос содержит новые данные, которые сервер должен сохранить.
- Read (Чтение):
- Отображение существующих данных.
- Обычно включает таблицы, списки или другие элементы интерфейса, показывающие существующие записи.
- Пользователь может просматривать, фильтровать и сортировать данные.
- Каждая запись обычно имеет ссылку или кнопку, позволяющую перейти к просмотру деталей или редактированию.
- HTTP метод: GET
- При запросе страницы для чтения данных (например, страницы списка или страницы с деталями записи), браузер отправляет запрос GET на сервер. Сервер обрабатывает этот запрос и возвращает данные для отображения на странице.
- Update (Обновление):
- Форма для изменения существующих данных.
- Загружает текущие данные в форму, позволяя пользователю внести изменения.
- После внесения изменений пользователь нажимает кнопку “Сохранить” или “Обновить”, чтобы отправить измененные данные на сервер.
- После успешного обновления может отобразить сообщение об успешном обновлении или перенаправить пользователя на страницу с подробностями обновленной записи.
- HTTP метод: PUT или PATCH
- При обновлении существующей записи пользователь отправляет данные на сервер с помощью запроса PUT или PATCH. PUT обычно используется для полного обновления записи, а PATCH - для частичного обновления (только измененных полей).
- Delete (Удаление):
- Подтверждение удаления существующих данных.
- Пользователь может нажать на кнопку “Удалить” рядом с записью или выбрать записи для удаления и подтвердить их удаление.
- После успешного удаления может отобразить сообщение об успешном удалении или перенаправить пользователя на страницу со списком оставшихся записей.
- HTTP метод: DELETE
- Когда пользователь удаляет запись, браузер отправляет запрос DELETE на сервер, содержащий информацию о том, какую запись следует удалить. Сервер обрабатывает этот запрос и удаляет соответствующую запись.
Эти четыре операции позволяют пользователям управлять данными в веб-приложениях. Интерфейс CRUD обычно реализуется с использованием HTML, CSS, JavaScript для фронтенда и языков программирования, таких как Python, Java, PHP для бэкенда. Библиотеки и фреймворки, такие как React, Angular, Django, Flask, также могут облегчить создание и управление такими интерфейсами.
Реализация REST интерфейса
Реализация на express.js
const express = require('express');
const app = express();
const PORT = 3000;
app.use(express.json());
let todos = [
{ id: 1, text: 'Покормить кота' },
{ id: 2, text: 'Сделать покупки' },
];
// READ (GET) - Получить все задачи
app.get('/api/todos', (req, res) => {
res.json(todos);
});
// CREATE (POST) - Создать новую задачу
app.post('/api/todos', (req, res) => {
const { text } = req.body;
const newTodo = { id: todos.length + 1, text };
todos.push(newTodo);
res.status(201).json(newTodo);
});
// READ (GET) - Получить задачу по ID
app.get('/api/todos/:id', (req, res) => {
const id = parseInt(req.params.id);
const todo = todos.find(todo => todo.id === id);
if (!todo) return res.status(404).send('Задача не найдена');
res.json(todo);
});
// UPDATE (PUT) - Обновить задачу по ID
app.put('/api/todos/:id', (req, res) => {
const id = parseInt(req.params.id);
const todo = todos.find(todo => todo.id === id);
if (!todo) return res.status(404).send('Задача не найдена');
todo.text = req.body.text;
res.json(todo);
});
// DELETE - Удалить задачу по ID
app.delete('/api/todos/:id', (req, res) => {
const id = parseInt(req.params.id);
const todoIndex = todos.findIndex(todo => todo.id === id);
if (todoIndex === -1) return res.status(404).send('Задача не найдена');
todos.splice(todoIndex, 1);
res.status(204).end();
});
// Запуск сервера
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
Аутентификация в Веб-приложениях
Описание
Аутентификация в веб-приложениях - это процесс проверки подлинности пользователя, который предоставляет доступ к ресурсам или функциональности приложения. Это важный аспект в обеспечении безопасности веб-приложений. Вот несколько основных методов аутентификации:
Форма входа (логин/пароль): Пользователь предоставляет учетные данные (обычно имя пользователя и пароль), которые затем сравниваются с данными, хранящимися в базе данных. Это наиболее распространенный метод аутентификации.
Токены доступа (Access Tokens): После успешной аутентификации пользователю выдается токен, который затем используется для аутентификации при каждом запросе к защищенным ресурсам на сервере. Токены могут быть долгоживущими (например, токен JWT) или короткоживущими с возможностью обновления.
OAuth и OpenID Connect: Это протоколы для авторизации и аутентификации пользователей через сторонние службы, такие как Google, Facebook или Twitter. OAuth используется для предоставления доступа к ресурсам, в то время как OpenID Connect предоставляет идентификационную информацию о пользователе.
Biometric Authentication: Это метод, в котором аутентификация осуществляется на основе биологических характеристик пользователя, таких как отпечатки пальцев, распознавание лица или сканер сетчатки глаза.
Двухфакторная аутентификация (2FA): Это метод, который требует от пользователя предоставить два различных типа идентификационной информации для подтверждения своей личности. Например, это может быть комбинация пароля и временного кода, отправленного на заранее зарегистрированное устройство.
Как правило, для обеспечения безопасности веб-приложения используются комбинации этих методов аутентификации, чтобы создать более надежную систему проверки подлинности.
Токены JWT
JWT (JSON Web Token) - это открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между двумя сторонами в формате JSON. Он может быть использован для аутентификации и обмена данных между клиентом и сервером.
Вот основные компоненты JWT:
Header (Заголовок): Содержит метаданные о типе токена и используемом алгоритме шифрования.
Payload (Нагрузка): Содержит утверждения (claims) - информацию о пользователе или другие данные. Существуют три типа утверждений: зарезервированные, общие и закрытые. Примеры: имя пользователя, срок действия токена, разрешения.
Signature (Подпись): Создается путем шифрования заголовка, нагрузки и секретного ключа с использованием указанного в заголовке алгоритма шифрования. Подпись используется для проверки целостности данных и подтверждения их подлинности.
JWT имеет несколько преимуществ:
Компактность: JWT является компактным форматом передачи данных, что делает его удобным для использования в URL и HTTP заголовках.
Самодостаточность: Вся необходимая информация для проверки подлинности и обработки токена содержится в самом токене, что упрощает его использование.
Расширяемость: JWT может быть расширен для включения любых пользовательских данных в виде JSON.
JWT широко используется для реализации аутентификации и авторизации в веб-приложениях, API и микросервисах. Он часто используется в сочетании с протоколами аутентификации, такими как OAuth 2.0, для обеспечения безопасности веб-приложений.
Пример
Вот пример JWT токена:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Разберем этот токен на его составляющие:
- Header (Заголовок):
В этом примере алгоритм шифрования (alg) - HS256, что указывает на использование алгоритма HMAC с хэшем SHA-256 для подписи токена.
- Payload (Нагрузка):
Здесь содержатся утверждения (claims) - информация о пользователе или другие данные. В данном случае: - “sub”: “1234567890” - идентификатор пользователя - “name”: “John Doe” - имя пользователя - “iat”: 1516239022 - время создания токена (в формате Unix Timestamp)
- Signature (Подпись):
Эта часть токена представляет собой подпись, созданную на основе заголовка, нагрузки и секретного ключа с использованием указанного в заголовке алгоритма шифрования.
OAuth и OpenID Connect
OAuth (Open Authorization) и OpenID Connect (OIDC) - это два важных протокола, которые используются для аутентификации и авторизации в веб-приложениях, API и мобильных приложениях. Вот краткое описание каждого из них:
- OAuth:
- Цель: OAuth предназначен для делегирования доступа третьим лицам к ресурсам пользователя без необходимости предоставления им логина и пароля.
- Как это работает: Владелец ресурса (пользователь) дает разрешение на доступ к своим данным третьим лицам (клиентам), предоставив им временный токен доступа. Этот токен используется для доступа к защищенным ресурсам на сервере без необходимости передачи учетных данных.
- Примеры использования: Приложения, запрашивающие доступ к вашему аккаунту в социальных сетях или календарю.
- OpenID Connect (OIDC):
- Цель: OpenID Connect представляет собой слой аутентификации поверх протокола OAuth 2.0, который предоставляет аутентификацию на основе токенов.
- Как это работает: OIDC добавляет идентификационный слой поверх OAuth, позволяя клиентам получать информацию об аутентифицированном пользователе в виде JWT токена (ID токена). Этот токен содержит информацию о пользователе, такую как идентификатор пользователя, имя, электронная почта и другие атрибуты.
- Примеры использования: Приложения, требующие аутентификации пользователя через сторонние сервисы, такие как Google или Facebook.
Оба протокола широко используются в современных веб-приложениях и API для обеспечения безопасности, аутентификации и авторизации пользователей. Они обеспечивают удобный и безопасный способ доступа к защищенным ресурсам и данным, минимизируя при этом риски передачи учетных данных и повышая уровень доверия пользователей.
Добавление аутентификации в веб-приложение
Для добавления аутентификации в ваше приложение вы можете использовать механизмы аутентификации, такие как токены JWT (JSON Web Tokens). Вот пример, как вы можете интегрировать JWT аутентификацию в ваше CRUD приложение на Express.js:
- Установите необходимые зависимости:
- Добавьте код для аутентификации в ваше приложение:
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const app = express();
const PORT = 3000;
app.use(express.json());
const users = [
{ id: 1, username: 'user1', password: '$2b$10$exj5bBbKDJ5UJX9PmIbX0OejV0h5W.0WTWr5PJm3c0pEKIq3FmL76' } // пароль: password
];
// Примеры данных (в реальном приложении они будут храниться в базе данных)
let todos = [
{ id: 1, text: 'Покормить кота' },
{ id: 2, text: 'Сделать покупки' },
];
const SECRET_KEY = 'your_secret_key'; // Секретный ключ для подписи токена
// Роут для аутентификации и создания JWT токена
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(user => user.username === username);
if (!user || !bcrypt.compareSync(password, user.password)) {
return res.status(401).json({ error: 'Неправильное имя пользователя или пароль' });
}
const token = jwt.sign({ userId: user.id }, SECRET_KEY, { expiresIn: '1h' }); // Создание токена
res.json({ token });
});
// Middleware для проверки токена
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
// READ (GET) - Получить все задачи
app.get('/api/todos', (req, res) => {
res.json(todos);
});
// CREATE (POST) - Создать новую задачу
app.post('/api/todos', authenticateToken, (req, res) => {
const { text } = req.body;
const newTodo = { id: todos.length + 1, text };
todos.push(newTodo);
res.status(201).json(newTodo);
});
// READ (GET) - Получить задачу по ID
app.get('/api/todos/:id', authenticateToken, (req, res) => {
const id = parseInt(req.params.id);
const todo = todos.find(todo => todo.id === id);
if (!todo) return res.status(404).send('Задача не найдена');
res.json(todo);
});
// UPDATE (PUT) - Обновить задачу по ID
app.put('/api/todos/:id', authenticateToken, (req, res) => {
const id = parseInt(req.params.id);
const todo = todos.find(todo => todo.id === id);
if (!todo) return res.status(404).send('Задача не найдена');
todo.text = req.body.text;
res.json(todo);
});
// DELETE - Удалить задачу по ID
app.delete('/api/todos/:id', authenticateToken, (req, res) => {
const id = parseInt(req.params.id);
const todoIndex = todos.findIndex(todo => todo.id === id);
if (todoIndex === -1) return res.status(404).send('Задача не найдена');
todos.splice(todoIndex, 1);
res.status(204).end();
});
// Старт сервера
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
Этот код добавляет аутентификацию через JWT в ваше приложение. После успешной аутентификации пользователя будет создан JWT токен, который будет передаваться при каждом запросе, требующем аутентификации. Маршруты CRUD теперь также защищены, и доступ к ним будет разрешен только при наличии действительного токена.
Шифрование токена
Если вы хотите зашифровать содержимое JWT токена (payload), чтобы скрыть его содержимое от посторонних глаз, то лучше использовать механизм шифрования с использованием симметричного или асимметричного ключа. Однако стоит помнить, что при использовании симметричного ключа (один ключ для шифрования и расшифровки) вам нужно будет хранить этот ключ в безопасном месте, так как любой, кто получит доступ к ключу, сможет расшифровать токены.
Вот пример использования симметричного шифрования с использованием библиотеки crypto
для шифрования и дешифрования содержимого токена:
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const crypto = require('crypto');
const app = express();
const PORT = 3000;
app.use(express.json());
const users = [
{ id: 1, username: 'user1', password: '$2b$10$exj5bBbKDJ5UJX9PmIbX0OejV0h5W.0WTWr5PJm3c0pEKIq3FmL76' } // пароль: password
];
const SECRET_KEY = 'your_secret_key'; // Секретный ключ для подписи токена
const ENCRYPTION_KEY = 'your_encryption_key'; // Секретный ключ для шифрования payload
// Роут для аутентификации и создания JWT токена
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(user => user.username === username);
if (!user || !bcrypt.compareSync(password, user.password)) {
return res.status(401).json({ error: 'Неправильное имя пользователя или пароль' });
}
const token = jwt.sign({ userId: user.id }, SECRET_KEY, { expiresIn: '1h' }); // Создание токена
const encryptedToken = encrypt(token, ENCRYPTION_KEY); // Шифрование токена
res.json({ token: encryptedToken });
});
// Функция для шифрования
function encrypt(text, key) {
const cipher = crypto.createCipher('aes-256-cbc', key);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
// Функция для дешифрования
function decrypt(encryptedText, key) {
const decipher = crypto.createDecipher('aes-256-cbc', key);
let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// Middleware для проверки токена
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
const decryptedToken = decrypt(token, ENCRYPTION_KEY); // Дешифрование токена
jwt.verify(decryptedToken, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
// CRUD операции с аутентификацией
app.get('/api/todos', authenticateToken, (req, res) => {
res.json(todos);
});
app.post('/api/todos', authenticateToken, (req, res) => {
// Добавление новой задачи
});
app.put('/api/todos/:id', authenticateToken, (req, res) => {
// Обновление задачи по ID
});
app.delete('/api/todos/:id', authenticateToken, (req, res) => {
// Удаление задачи по ID
});
// Запуск сервера
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
В этом примере используется симметричное шифрование с использованием AES-256-CBC. При аутентификации пользователей токен подписывается (с помощью jwt.sign
), а затем шифруется с использованием ключа шифрования. При каждом запросе токен дешифруется, а затем проверяется на подлинность с помощью jwt.verify
.
Отладка REST интерфейса
Описание
Отладка REST интерфейса в приложении на Express.js может быть выполнена с использованием различных инструментов и методов. Вот несколько подходов:
- Использование логирования: Добавьте логирование в ваши маршруты, чтобы видеть, какие запросы приходят и как обрабатываются на сервере. Например, вы можете использовать
console.log()
для вывода в консоль информации о запросах и ответах.
app.get('/api/todos', (req, res) => {
console.log('Получен GET запрос на /api/todos');
// Обработка запроса...
});
Использование инструментов для работы с HTTP: Вы можете использовать инструменты для работы с HTTP, такие как curl или Postman, чтобы отправлять запросы к вашему API и проверять, как они обрабатываются.
Использование инструментов разработчика браузера: Если вы разрабатываете веб-приложение, вы можете использовать инструменты разработчика браузера (например, Developer Tools в Chrome или Firefox) для отладки сетевых запросов. Вы сможете видеть отправляемые запросы и получаемые ответы прямо из браузера.
Использование инструментов мониторинга трафика: Некоторые инструменты мониторинга сетевого трафика, такие как Wireshark, позволяют отслеживать весь сетевой трафик, включая HTTP запросы и ответы. Они могут быть полезными для более глубокого анализа трафика.
Использование средств отладки Express.js: Вы можете использовать средства отладки, предоставляемые Express.js, такие как middleware
express-debug
, который помогает отслеживать состояние запроса и ответа, а также данные об ошибке.
const expressDebug = require('express-debug');
app.use(expressDebug({}));
// После этого вы можете посмотреть отладочную информацию в консоли приложения
Выберите подход, который наиболее удобен и эффективен для вашего конкретного случая. Как правило, комбинация различных инструментов и методов может быть наиболее полезной для эффективной отладки вашего REST интерфейса.
Использование curl
Использование curl
- это один из наиболее распространенных способов отправки HTTP запросов из командной строки или скриптов. Вот несколько примеров использования curl
для отправки различных типов запросов к вашему REST интерфейсу:
- GET запрос:
- POST запрос с JSON телом:
curl -X POST -H "Content-Type: application/json" -d '{"text":"Новая задача"}' http://localhost:3000/api/todos
- PUT запрос с JSON телом:
curl -X PUT -H "Content-Type: application/json" -d '{"text":"Обновленная задача"}' http://localhost:3000/api/todos/1
- DELETE запрос:
Для отправки токена аутентификации с помощью curl
, вы можете использовать заголовок Authorization
с типом схемы Bearer, где токен предваряется строкой “Bearer” (пробел после слова “Bearer”). Вот как это можно сделать:
В этом примере curl
отправляет GET запрос на URL http://localhost:3000/api/todos
и добавляет заголовок Authorization
, содержащий токен. Замените ваш_токен
на реальный JWT токен аутентификации.
Этот метод работает для всех типов запросов (GET, POST, PUT, DELETE) и для всех эндпоинтов, которые требуют аутентификации через JWT токен.
Использование Postman
Postman - это удобный инструмент для тестирования и отладки API. Вот как использовать Postman:
Установите Postman: Если у вас еще нет Postman, вы можете загрузить его с официального сайта getpostman.com.
Откройте Postman: Запустите Postman на вашем компьютере.
Создайте новый запрос: Нажмите на кнопку “New” в верхнем левом углу Postman для создания нового запроса.
Выберите тип запроса и укажите URL: Выберите тип запроса (GET, POST, PUT, DELETE и т.д.) и введите URL вашего API.
Добавьте заголовок для аутентификации: Нажмите на вкладку “Headers” и добавьте заголовок
Authorization
со значениемBearer ваш_токен
, заменивваш_токен
на реальный JWT токен аутентификации.Отправьте запрос: Нажмите кнопку “Send” для отправки запроса.
Postman отправит запрос на ваше API, включая токен аутентификации в заголовке. Вы увидите ответ от вашего сервера прямо в Postman.
Postman также позволяет вам сохранять запросы, организовывать их в коллекции, выполнять тесты на ответы и многое другое, что делает его мощным инструментом для разработчиков при работе с API.
Использование Swagger
Swagger - это инструмент для описания, разработки, тестирования и использования API через интерфейс. Он позволяет создавать и поддерживать документацию для вашего API, а также проводить тестирование запросов прямо из пользовательского интерфейса.
Вот как использовать Swagger для документирования вашего REST интерфейса:
- Установите Swagger: Существует несколько способов использования Swagger. Один из них - использовать инструмент OpenAPI, ранее известный как Swagger. Вы можете установить его с помощью npm:
- Создайте спецификацию OpenAPI (Swagger): Создайте файл
swagger.yaml
илиswagger.json
, в котором опишите ваше API с помощью спецификации OpenAPI. Это включает в себя описание эндпоинтов, параметров запроса, типов данных и т.д. Вот пример простой спецификации OpenAPI:
openapi: 3.0.0
info:
title: Пример API
version: 1.0.0
paths:
/api/todos:
get:
summary: Получить список задач
responses:
'200':
description: Успешный ответ
post:
summary: Создать новую задачу
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
responses:
'201':
description: Задача создана
/api/todos/{id}:
get:
summary: Получить задачу по ID
parameters:
- in: path
name: id
required: true
schema:
type: integer
responses:
'200':
description: Успешный ответ
put:
summary: Обновить задачу по ID
parameters:
- in: path
name: id
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
responses:
'200':
description: Задача обновлена
delete:
summary: Удалить задачу по ID
parameters:
- in: path
name: id
required: true
schema:
type: integer
responses:
'204':
description: Задача удалена
- Подключите Swagger к вашему приложению Express.js: Используйте пакет
swagger-ui-express
для подключения Swagger к вашему приложению Express.js:
const express = require('express');
const swaggerUi = require('swagger-ui-express');
const YAML = require('yamljs');
const swaggerDocument = YAML.load('./swagger.yaml');
const app = express();
const PORT = 3000;
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
// Ваш код приложения Express.js...
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
- Запустите сервер и откройте документацию Swagger: Запустите ваше приложение Express.js и перейдите по адресу
http://localhost:3000/api-docs
, чтобы увидеть сгенерированную документацию Swagger.
Документация Swagger будет автоматически сгенерирована на основе вашей спецификации OpenAPI (Swagger) и предоставит вам интерфейс для тестирования каждого эндпоинта вашего API.