Русский
  • express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

Защитите ваш Express.js API с помощью JWT и Logto

Узнайте, как защитить ваши конечные точки API в Express.js с помощью JSON Web Tokens (JWT) и Logto.

Gao
Gao
Founder

Введение

Когда вы разрабатываете веб-приложение, важно защитить ваши конечные точки API от несанкционированного доступа. Представьте, что вы создаете сайт онлайн-магазина; вам совершенно не нужно, чтобы кибер-воришки использовали ваш API.

Предположим, вы уже создали приложение на Express.js с аутентификацией пользователей, где пользователи должны войти в систему, прежде чем совершить определенные действия. Если нет, вы можете начать свой путь с Logto. Это требует всего лишь нескольких строк кода, чтобы установить поток аутентификации пользователей.

Однако, даже после аутентификации пользователя, у вас есть различные варианты защиты ваших конечных точек API. К сожалению, у большинства из этих опций есть свои недостатки:

  • Аутентификация на основе сессий: Привязывание вашего API к хранилищу сессий, которое не масштабируемо и не подходит для микросервисов.
  • Вызов сервиса аутентификации: Это вводит дополнительный сетевой вызов, увеличивая задержку и затраты. Некоторые сервисы аутентификации даже взимают плату в зависимости от объема вызовов API, что потенциально может привести к большим расходам.

В этом руководстве мы покажем, как укрепить ваши конечные точки API, используя JSON Web Tokens (JWT) и Logto. Этот подход предлагает масштабируемость и минимальные дополнительные затраты.

Предварительные требования

Прежде чем углубляться, убедитесь, что у вас есть следующее:

Определите ваш API ресурс в Logto

Logto в полной мере использует RFC 8707: Resource Indicators for OAuth 2.0 для защиты ваших конечных точек API. Это означает, что вы можете определять свои API ресурсы, используя их фактические URL.

Перейдите на вкладку "API ресурсы" в Logto Console и нажмите "Создать API ресурс", чтобы создать новый. Например, если вы хотите защитить конечную точку /api/products, вы можете использовать URL https://yourdomain.com/api/products в качестве идентификатора.

Создать API ресурс

Получите токен доступа в вашем клиентском приложении

Чтобы продолжить, вам нужно интегрировать SDK Logto в ваше клиентское приложение. Это приложение может отличаться от вашего бэкэнда на Express.js; например, у вас может быть React-приложение, использующее Express.js в качестве серверной части API.

Вам также нужно будет изменить конфигурацию SDK Logto, чтобы сообщить Logto, что вы хотите запросить токен доступа для вашего API в этом разрешении. Вот пример использования React:

После того как пользователь вошел в систему с Logto, isAuthenticated в SDK Logto станет true:

Теперь вы можете использовать метод getAccessToken, чтобы получить токен доступа для вашего API:

Наконец, включите этот токен доступа в заголовок Authorization, когда делаете запросы к вашему API:

Проверьте токен доступа в вашем API

В вашем приложении на Express.js установите библиотеку jose для проверки JWT:

Так как мы используем аутентификацию Bearer, извлеките токен доступа из заголовка Authorization:

Далее создайте посредника для проверки токена доступа:

Теперь вы можете использовать этот посредник для защиты ваших конечных точек API:

С помощью этого подхода вам не нужно обращаться к серверу Logto каждый раз, когда приходит запрос. Вместо этого вы загружаете набор ключей JSON Web (JWKS) с сервера Logto один раз и затем проверяете токены доступа локально.

Управление доступом на основе ролей

На данный момент мы только проверили, что пользователь вошел в систему с помощью Logto. Мы все еще не знаем, обладает ли пользователь соответствующими правами доступа к конечной точке API. Это потому, что Logto позволяет любому получить токен доступа для существующего ресурса API.

Чтобы решить эту проблему, мы можем использовать управление доступом на основе ролей (RBAC). В Logto вы можете определить роли и назначить им разрешения. Ознакомьтесь с этим руководством, чтобы узнать, как определять роли и разрешения в Logto.

После определения ролей и разрешений вы можете добавить опцию scopes в компонент LogtoProvider:

Logto затем выдаст токен доступа только с соответствующими разрешениями для пользователя. Например, если у пользователя есть только право read:products, токен доступа будет содержать только это разрешение:

Если у пользователя есть оба — read:products и write:products, токен доступа будет содержать оба разрешения с пробелом в качестве разделителя:

В вашем приложении на Express.js вы можете проверить, содержит ли токен доступа корректные разрешения, перед тем как предоставить доступ к конечной точке API:

Заключение

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

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