#node.js #react-native #api #rest #express
#node.js #react-native #API #rest #экспресс
Вопрос:
Мне было интересно, можно ли защитить RESTful API expressjs, к которому могут получить доступ только приложение react native и веб-сайт react.
Например, мой сервер работает на порту 8000, мое приложение react native находится на порту 3000, а мой веб-сайт — на порту 5000. Я хочу, чтобы сервер прослушивал только запросы, поступающие с этих портов.
Допустим, у меня есть почтовый маршрут к mydomain.com/signup Я не хочу, чтобы пользователи отправляли этот запрос post с помощью внешних веб-сайтов или инструментов, таких как Postman.
Каков наилучший способ обеспечить, чтобы мое мобильное приложение и веб-сайт были единственными, которым разрешен доступ к моим RESTful маршрутам.
Ответ №1:
Во-первых, вы немного ошибаетесь в том, как работает запрос к вашему API. Когда ваше приложение react на порту 3000 отправляет запрос на ваш сервер на порту 8000, это просто случайный входящий запрос. Он не «приходит» с порта 3000. Фактически, входящий номер порта с каким-либо случайно сгенерированным портом с 5 или 6 цифрами. Исходящие порты динамически генерируются системой TCP, и вы не можете сказать, из какого «приложения» оно пришло.
Во-вторых, ваш сервер RESTful API — это просто сервер в Интернете. Любой может сделать запрос к нему. Используя защиту от перекрестного происхождения, вы можете установить некоторые ограничения на то, что можно сделать с помощью Javascript браузера (разрешая только запросы с веб-страниц вашего конкретного домена), но другие запросы (не из браузера) не могут быть заблокированы таким образом.
Итак, любой программист, использующий любой инструмент, отличный от браузера, может написать код для вашего API. Что делает кто-то вроде Google, так это требует, чтобы у вас был либо APIKey, который они вам выдали, либо им требуются некоторые учетные данные для входа (часто cookie из предыдущего входа конечного пользователя), который идентифицирует пользователя, отправляющего запрос, как разрешенного пользователя, использующего их систему. Даже с помощью этих инструментов это просто означает, что разрешенный пользователь получает доступ к API, это не означает, что только ваше приложение получает доступ к API. И, на самом деле, вы не можете предотвратить это.
Итак, что делает большинство людей, так это то, что им требуются учетные данные для входа или APIKey, и они отслеживают тип использования API. Если использование API кажется подходящим (в частности, типы и частота запросов), то такое использование разрешено. Если использование API не представляется целесообразным (часто слишком много запросов в течение некоторого периода времени), то для этого конкретного пользователя или пользователя может быть заблокирован доступ к сервису временно или навсегда.
Допустим, у меня есть почтовый маршрут к mydomain.com/signup Я не хочу, чтобы пользователи отправляли этот запрос post с помощью внешних веб-сайтов или инструментов, таких как Postman.
Вы не можете эффективно это сделать. Существуют препятствия, которые вы можете возвести, чтобы усложнить задачу, например, поместить токен с истекающим сроком действия на свою веб-страницу и включить токен при собственном использовании API, а затем определить, является ли он действительным токеном, но решительный хакер просто удалит токен с веб-страницы и все равно получит доступ к вашему API, используя его из любого инструмента программирования, который они захотят.
Каков наилучший способ обеспечить, чтобы мое мобильное приложение и веб-сайт были единственными, которым разрешен доступ к моим RESTful маршрутам.
Вы не можете. Ваш API находится в Интернете. Любой, у кого есть необходимые вам учетные данные, может получить к нему доступ.
Комментарии:
1. Большое вам спасибо за ваше четкое объяснение! Я действительно ценю время и усилия, которые вы вложили в свои ответы, чтобы помочь мне.