У меня есть сервер Node.js, который будет обрабатывать запросы моего мобильного приложения Flutter. Приложение Flutter использует модуль http для отправки запросов на сервер. Сервер Node.js использует CORS. Как мне убедиться, что мой сервер принимает запросы только от моих мобильных приложений?
Я заметил, что один из способов — использовать API-ключ в приложении, который генерируется в приложении и должен быть отправлен на сервер. Если API-ключ действителен, сервер отвечает соответствующим ответом. Однако моя единственная проблема заключается в том, что если кто-то перехватит эти HTTP-запросы, сделанные из мобильного приложения, он сможет просмотреть этот API-ключ и имитировать свои собственные http-запросы, как если бы они исходили из моего мобильного приложения.
Другое опубликованное решение заключалось в использовании чего-то вроде OAuth. Но я не уверен, что это решение, если да, то объясните, как бы я его реализовал.
Другое решение, которое было показано, заключалось в использовании какого-либо SSL. Но для этого требуется сертификат или что-то в этом роде, и я не понимаю, как он на самом деле работает, и не знаю, можно ли его использовать с флаттер-приложениями.
Пожалуйста, предложите любые другие решения этой проблемы, которые вы считаете подходящими.
Ваша проблема в том, что ваше мобильное приложение является «публичным клиентом». Это означает, что он не может безопасно хранить какой-либо секрет, который мог бы идентифицироваться API node.js. Вот почему подход с использованием ключей API будет неэффективным; злоумышленник может извлечь его из приложения на своем устройстве.
Лучшим способом было бы забыть о личности устройства и использовать личность пользователя. Заставьте их пройти аутентификацию и используйте их личность, чтобы подтвердить, разрешено ли им использовать API. Здесь на помощь приходит OAuth/OIDC. OAuth позволяет одному сервису (в данном случае вашему мобильному приложению) получать доступ к ресурсам другого (вашего API) от имени пользователя. OIDC — это простой протокол аутентификации поверх OAuth, который позволит вам аутентифицировать ваших пользователей.
Для этого сначала нужно найти провайдера OIDC. Вы можете использовать тот, где ваши пользователи уже могут иметь личность - например. Google или Facebook — при необходимости, чтобы они могли войти в систему, используя существующую учетную запись. Или вы можете настроить свой собственный, используя такой сервис, как AWS Cognito, где ваши пользователи будут регистрировать новую учетную запись. Тогда ваше приложение -> вызов API будет выглядеть примерно так:
Эти шаги упрощены; узнайте о реализации OIDC с PKCE у выбранного вами поставщика OIDC.
Наконец, между приложением и API требуется SSL, или, точнее, теперь TLS, иначе злоумышленник сможет увидеть данные и токены между приложением и API.
Недавно Firebase выпустила сервис под названием Firebase App Check
Пожалуйста, посмотрите. Это может решить вашу проблему.
https://firebase.google.com/docs/app-check