Отправка данных из одного места в другое? Для собственного спокойствия и защиты ваших пользователей вам следует защитить его с помощью JWT.

Когда вы создаете приложение, очень важно защитить конфиденциальные данные от несанкционированного доступа. Многие современные веб-, мобильные и облачные приложения используют REST API в качестве основного средства связи. В результате крайне важно проектировать и разрабатывать серверные API, уделяя первостепенное внимание безопасности.

Один из эффективных подходов к защите REST API включает использование веб-токенов JSON (JWT). Эти токены предлагают надежный механизм аутентификации и авторизации пользователей, помогая защитить защищенные ресурсы от доступа злоумышленников.

Что такое веб-токены JSON?

Веб-токен JSON (JWT) — широко используемый стандарт безопасности. Он предоставляет краткий автономный метод безопасной передачи данных между клиентским приложением и серверной системой.

REST API может использовать JWT для безопасной идентификации и аутентификации пользователей, когда они делают HTTP-запросы для доступа к защищенным ресурсам.

instagram viewer

Веб-токен JSON состоит из трех отдельных частей: заголовка, полезной нагрузки и подписи. Он кодирует каждую часть и объединяет их с помощью точки (".").

Заголовок описывает криптографический алгоритм, используемый для подписи токена, а полезная нагрузка содержит данные о пользователе и любые дополнительные метаданные.

Наконец, подпись, вычисленная с использованием заголовка, полезной нагрузки и секретного ключа, обеспечивает целостность и подлинность токена.

Изучив основы JWT, давайте создадим REST API Node.js и реализуем JWT.

Настройка приложения Express.js и базы данных MongoDB

Здесь вы узнаете, как создать простую аутентификацию ОТДЫХА API который обрабатывает как регистрацию, так и вход в систему. Как только процесс входа в систему аутентифицирует пользователя, он должен иметь возможность делать HTTP-запросы к защищенному маршруту API.

Вы можете найти код проекта в этом Репозиторий GitHub.

Для начала, создать веб-сервер Expressи установите эти пакеты:

npm установить cors dotenv bycrpt mongoose cookie-parser крипто jsonwebtoken mongodb

Следующий, создать базу данных MongoDB или настроить кластер MongoDB в облаке. Затем скопируйте строку подключения к базе данных, создайте .env файл в корневом каталоге и вставьте в строку подключения:

CONNECTION_STRING="строка подключения"

Настройка подключения к базе данных

Создать новый утилиты/db.js файл в корневом каталоге папки вашего проекта. В этот файл добавьте следующий код, чтобы установить соединение с базой данных с помощью Mongoose.

константа мангуст = требовать('мангуста');

константа подключить БД = асинхронный () => {
пытаться {
Ждите mongoose.connect (процесс.env. СОЕДИНЕНИЕ_STRING);
консоль.бревно("Подключено к MongoDB!");
} ловить (ошибка) {
консоль.ошибка(«Ошибка подключения к MongoDB:», ошибка);
}
};

модуль.экспорт = подключить БД;

Определите модель данных

Определите простую схему пользовательских данных с помощью Mongoose. В корневом каталоге создайте новый модель/user.model.js файл и добавьте следующий код.

константа мангуст = требовать('мангуста');

константа пользовательская схема = новый мангуста. Схема({
имя пользователя: Нить,
пароль: {
тип: Нить,
необходимый: истинный,
уникальный: истинный,
},
});

константа Пользователь = мангуст.модель("Пользователь", пользовательская схема);
модуль.экспорт = пользователь;

Определите контроллеры для маршрутов API

Функции контроллера будут управлять регистрацией и входом в систему; они составляют существенную часть этой примерной программы. В корневом каталоге создайте контроллеры/userControllers.js файл и добавьте следующий код:

  1. Определите контроллер регистрации пользователей.
    константа Пользователь = требовать('../модели/user.model');
    константа бкрипт = требовать('bcrypt');
    константа { сгенерировать токен } = требовать('../промежуточное ПО/аутентификация');

    экспорт.registerUser = асинхронный (требование, разрешение) => {
    константа {имя пользователя, пароль} = req.body;

    пытаться {
    константа хэш = Ждите bcrypt.hash (пароль, 10);
    Ждите User.create({имя пользователя, пароль: хэш });
    рез.статус(201).отправлять({ сообщение: «Пользователь успешно зарегистрирован» });
    } ловить (ошибка) {
    консоль.лог (ошибка);
    рез.статус(500).отправлять({ сообщение: 'Произошла ошибка!! ' });
    }
    };

    Этот фрагмент кода хэширует предоставленный пароль с помощью bcrypt, а затем создает новую запись пользователя в базе данных, сохраняя имя пользователя и хешированный пароль. Если регистрация прошла успешно, он отправляет ответ с сообщением об успешном завершении.
  2. Определите контроллер входа в систему для управления процессом входа пользователя:
    экспорт.loginUser = асинхронный (требование, разрешение) => {
    константа {имя пользователя, пароль} = req.body;

    пытаться {
    константа пользователь = Ждите User.findOne({имя пользователя});

    если (!пользователь) {
    возвращаться рез.статус(404).отправлять({ сообщение: 'Пользователь не найден' });
    }

    константа парольMatch = Ждите bcrypt.compare(пароль, user.password);

    если (!Соответствие паролю) {
    возвращаться рез.статус(401).отправлять({ сообщение: 'Неверные логин или пароль' });
    }

    константа полезная нагрузка = { ID пользователя: ID пользователя };
    константа токен = generateToken (полезная нагрузка);
    res.cookie(жетон, токен, { httpТолько: истинный });
    рез.статус(200).json({ сообщение: 'Авторизация успешна'});
    } ловить (ошибка) {
    консоль.лог (ошибка);
    рез.статус(500).отправлять({ сообщение: «Произошла ошибка при входе в систему» });
    }
    };

    Когда пользователь отправляет запрос на /login route, они должны передать свои учетные данные для аутентификации в теле запроса. Затем код проверяет эти учетные данные и создает веб-маркер JSON. Токен надежно хранится в файле cookie с httpТолько флаг установлен в значение true. Это предотвращает доступ клиентского JavaScript к токену, защищая от потенциальных атак межсайтового скриптинга (XSS).
  3. Наконец, определите защищенный маршрут:
    экспорт.getUsers = асинхронный (требование, разрешение) => {
    пытаться {
    константа пользователи = Ждите Пользователь. найти ({});
    res.json (пользователи);
    } ловить (ошибка) {
    консоль.лог (ошибка);
    рез.статус(500).отправлять({ сообщение: 'Произошла ошибка!!' });
    }
    };
    При сохранении JWT в файле cookie последующие запросы API от пользователя, прошедшего проверку подлинности, будут автоматически включать токен, что позволит серверу проверять и авторизовать запросы.

Создание ПО промежуточного слоя аутентификации

Теперь, когда вы определили контроллер входа в систему, который генерирует токен JWT после успешной аутентификации, определите функции аутентификации промежуточного слоя, которые будут генерировать и проверять токен JWT.

В корневом каталоге создайте новую папку, промежуточное ПО. В эту папку добавьте два файла: auth.js и config.js.

Добавьте этот код в config.js:

константа крипто = требовать('крипто');

модуль.экспорт = {
секретный ключ: crypto.randomBytes(32).нанизывать('шестнадцатеричный')
};

Этот код генерирует новый случайный секретный ключ при каждом запуске. Затем вы можете использовать этот секретный ключ для подписи и проверки подлинности JWT. После успешной аутентификации пользователя создайте и подпишите JWT с помощью секретного ключа. Затем сервер будет использовать ключ для проверки правильности JWT.

Добавьте следующий код в auth.js который определяет функции промежуточного программного обеспечения, которые генерируют и проверяют JWT.

константа джвт = требовать('jsonwebtoken');
константа { секретный ключ } = требовать('./конфигурация');

константа Генерировать Токен = (полезная нагрузка) => {
константа токен = jwt.sign (полезная нагрузка, секретный ключ, { истекает: '1ч' });
возвращаться токен ;
};

константа подтвердитьТокен = (запрос, разрешение, следующий) => {
константа токен = req.cookies.token;

если (! токен) {
возвращаться рез.статус(401).json({ сообщение: «Токен не предоставлен» });
}

jwt.verify (токен, секретный ключ, (ошибка, декодировано) => {
если (ошибка) {
возвращаться рез.статус(401).json({ сообщение: «Недействительный токен» });
}

req.userId = декодированный.userId;
следующий();
});
};

модуль.exports = { generateToken, verifyToken };

сгенерировать токен Функция генерирует JWT, подписывая полезную нагрузку с помощью секретного ключа и устанавливая время истечения срока действия, в то время как VerifyToken служит промежуточным программным обеспечением для проверки подлинности и достоверности предоставленного токена.

Определите маршруты API

Создать новый маршруты /userRoutes.js файл в корневом каталоге и добавьте следующий код.

константа экспресс = требовать('выражать');
константа роутер = экспресс. Маршрутизатор();
константа пользовательские контроллеры = требовать('../контроллеры/пользовательконтроллеры');
константа {проверитьтокен} = требовать('../промежуточное ПО/аутентификация');
роутер.пост('/апи/регистр', userControllers.registerUser);
роутер.пост('/апи/логин', userControllers.loginUser);
роутер.получить('/API/пользователи', verifyToken, userControllers.getUsers);
модуль.экспорт = маршрутизатор;

Обновите точку входа на сервер

Обновите свой сервер.js файл со следующим кодом.

константа экспресс = требовать('выражать');
константа кор = требовать(корс);
константа приложение = экспресс();
константа порт = 5000;
требовать('дотенв').конфиг();
константа подключить БД = требовать('./утилиты/дб');
константа cookieParser = требовать('cookie-парсер');

подключить БД();

app.use(express.json());
app.use (express.urlencoded({ расширенный: истинный }));
app.use(cors());
app.use(cookieParser());
константа пользовательские маршруты = требовать('./маршруты/userRoutes');
приложение.использовать('/', пользовательские маршруты);

app.listen (порт, () => {
консоль.бревно(`Сервер прослушивает http://localhost:${порт}`);
});

Чтобы протестировать REST API, разверните сервер разработки и отправьте запросы API к определенным конечным точкам:

узел server.js

Защита API REST Node.js

Защита API-интерфейсов REST Node.js выходит за рамки простого использования JWT, хотя они играют решающую роль в аутентификации и авторизация, важно принять целостный подход к безопасности для защиты вашего бэкэнда системы. Наряду с JWT вам также следует рассмотреть возможность реализации HTTPS для шифрования связи, проверки и очистки ввода и многих других.

Комбинируя несколько мер безопасности, вы можете создать надежную систему безопасности для вашего Node.js REST API и минимизировать риск несанкционированного доступа, утечки данных и других мер безопасности. угрозы.