Цели

Узнайте, как использовать express.js для создания простого RESTful API для демонстрации аутентификации JWS.

Технический стек

JavaScript, Node.js, экспресс.js, Nodemon

Что такое промежуточное ПО?

Промежуточное ПО в node.js — это функция, которая будет иметь все права доступа для запроса объекта, ответа на объект и перехода к следующей функции промежуточного ПО в приложении цикл запрос-ответ. Эту функцию можно использовать для изменения объектов req и res для таких задач, как добавление заголовков ответа, анализ тела запроса и т. д. Прочтите этот пост, чтобы узнать больше о промежуточном программном обеспечении.

Реализация JWT: токен доступа

Обзор

Это приложение Node.js, использующее Express.js, которое обслуживает список сообщений. Он включает аутентификацию с использованием веб-токенов JSON (JWT) для защиты конечной точки «/posts», гарантируя, что только авторизованные пользователи могут получать доступ к принадлежащим им сообщениям.

Создайте наш сервер

  • app.use(express.json()):добавляет промежуточное ПО в приложение Express, которое анализирует входящие данные JSON. Это позволяет приложению обрабатывать полезные данные JSON в запросах.
  • app.get("/posts", authenticationToken, (req, res) =› {…}): Устанавливает маршрут HTTP GET по пути "/posts". Когда клиент отправляет запрос GET в «/posts», сначала выполняется промежуточная функция authenticationToken, а затем вызывается функция обратного вызова для маршрута, если аутентификация прошла успешно.
  • function authenticationToken(req, res, next) {…}: Это промежуточная функция с именем authenticationToken. Функции ПО промежуточного слоя имеют доступ к объектам запроса (req) и ответа (res) и могут выполнять действия перед передачей управления следующему ПО промежуточного слоя или обработчику маршрута.

Создайте другой сервер аутентификации

В этом фрагменте кода, когда клиент отправляет запрос POST на «/login» с именем пользователя в теле запроса, сервер аутентифицирует пользователя (в данном случае просто создает объект пользователя с именем пользователя). Затем сервер генерирует токен доступа с помощью функции generateAccessToken, который включает информацию о пользователе (имя пользователя) и срок действия 60 секунд.

Здесь мы можем использовать расширение vscode REST Client для тестирования нашего сервера.

Отправить POST-запрос на сервер

POST http://localhost:4000/login
Content-Type: application/json

{
    "username": "Willie"
}

Вы получите ответ от сервера, подобный этому:

Замените токен доступа в своем запросе GET, а затем вы можете снова запросить сервер.

GET http://localhost:3000/posts
Authorization: Bearer {YOUR_ACCESS_TOKEN}

Вы получите ответ (все посты принадлежат конкретному пользователю, в данном случае: Вилли) от сервера примерно такого вида:

Реализация JWT: токен обновления

Здесь мы модифицируем authServer.js и реализуем конечную точку /token для обмена токена обновления на новый токен доступа. Обратите внимание, что мы используем массив для хранения токенов обновления, что не рекомендуется в рабочей среде. В рабочей среде токены обновления следует хранить в базе данных.

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

Деаутентификация (выход)

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

Давайте проверим нашу конечную точку /logout:

DELETE http://localhost:4000/logout
Content-Type: application/json
{
    "token": {YOUR_REFRESH_TOKEN}
}

Когда пользователь отправляет запрос POST на эту конечную точку, у пользователя больше нет доступа к нашему бэкэнду!

Заключение

Это обертка! С помощью Express.js мы можем удобно тестировать аутентификацию JWS и моделировать ее работу. Надеюсь, вам понравится этот пост!

Оформить заказ все мои сообщения в БЛОГЕ



Ресурсы

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .