Защитите ваш Express.js API с помощью JWT и Logto
Узнайте, как защитить ваши конечные точки API в Express.js с помощью JSON Web Tokens (JWT) и Logto.
Введение
Когда вы разрабатываете веб-приложение, важно защитить ваши конечные точки API от несанкционированного доступа. Представьте, что вы создаете сайт онлайн-магазина; вам совершенно не нужно, чтобы кибер-воришки использовали ваш API.
Предположим, вы уже создали приложение на Express.js с аутентификацией пользователей, где пользователи должны войти в систему, прежде чем совершить определенные действия. Если нет, вы можете начать свой путь с Logto. Это требует всего лишь нескольких строк кода, чтобы установить поток аутентификации пользователей.
Однако, даже после аутентификации пользователя, у вас есть различные варианты защиты ваших конечных точек API. К сожалению, у большинства из этих опций есть свои недостатки:
- Аутентификация на основе сессий: Привязывание вашего API к хранилищу сессий, которое не масштабируемо и не подходит для микросервисов.
- Вызов сервиса аутентификации: Это вводит дополнительный сетевой вызов, увеличивая задержку и затраты. Некоторые сервисы аутентификации даже взимают плату в зависимости от объема вызовов API, что потенциально может привести к большим расходам.
В этом руководстве мы покажем, как укрепить ваши конечные точки API, используя JSON Web Tokens (JWT) и Logto. Этот подход предлагает масштабируемость и минимальные дополнительные затраты.
Предварительные требования
Прежде чем углубляться, убедитесь, что у вас есть следующее:
- Аккаунт Logto. Если у вас его нет, вы можете зарегистрироваться бесплатно.
- Проект Express.js, который требует защиты API, и клиентское приложение, которое потребляет API.
- Базовые знания о JSON Web Token (JWT).
Определите ваш 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
в качестве идентификатора.
Получите токен доступа в вашем клиентском приложении
Чтобы продолжить, вам нужно интегрировать 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. Наше сообщество всегда радо вам помочь.