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

У меня есть сервер Node.js, который будет обрабатывать запросы моего мобильного приложения Flutter. Приложение Flutter использует модуль http для отправки запросов на сервер. Сервер Node.js использует CORS. Как мне убедиться, что мой сервер принимает запросы только от моих мобильных приложений?

Я заметил, что один из способов — использовать API-ключ в приложении, который генерируется в приложении и должен быть отправлен на сервер. Если API-ключ действителен, сервер отвечает соответствующим ответом. Однако моя единственная проблема заключается в том, что если кто-то перехватит эти HTTP-запросы, сделанные из мобильного приложения, он сможет просмотреть этот API-ключ и имитировать свои собственные http-запросы, как если бы они исходили из моего мобильного приложения.

Другое опубликованное решение заключалось в использовании чего-то вроде OAuth. Но я не уверен, что это решение, если да, то объясните, как бы я его реализовал.

Другое решение, которое было показано, заключалось в использовании какого-либо SSL. Но для этого требуется сертификат или что-то в этом роде, и я не понимаю, как он на самом деле работает, и не знаю, можно ли его использовать с флаттер-приложениями.

Пожалуйста, предложите любые другие решения этой проблемы, которые вы считаете подходящими.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша проблема в том, что ваше мобильное приложение является «публичным клиентом». Это означает, что он не может безопасно хранить какой-либо секрет, который мог бы идентифицироваться API node.js. Вот почему подход с использованием ключей API будет неэффективным; злоумышленник может извлечь его из приложения на своем устройстве.

Лучшим способом было бы забыть о личности устройства и использовать личность пользователя. Заставьте их пройти аутентификацию и используйте их личность, чтобы подтвердить, разрешено ли им использовать API. Здесь на помощь приходит OAuth/OIDC. OAuth позволяет одному сервису (в данном случае вашему мобильному приложению) получать доступ к ресурсам другого (вашего API) от имени пользователя. OIDC — это простой протокол аутентификации поверх OAuth, который позволит вам аутентифицировать ваших пользователей.

Для этого сначала нужно найти провайдера OIDC. Вы можете использовать тот, где ваши пользователи уже могут иметь личность - например. Google или Facebook — при необходимости, чтобы они могли войти в систему, используя существующую учетную запись. Или вы можете настроить свой собственный, используя такой сервис, как AWS Cognito, где ваши пользователи будут регистрировать новую учетную запись. Тогда ваше приложение -> вызов API будет выглядеть примерно так:

  1. Приложение инициирует процесс аутентификации с помощью поставщика OIDC и направляет пользователя на страницу аутентификации поставщиков OIDC.
  2. Пользователь проходит аутентификацию, служба OIDC перенаправляет обратно в приложение с некоторыми сведениями, чтобы приложение могло получить токены доступа/идентификатора от службы OIDC.
  3. Приложение отправляет запросы к API, используя токены службы OIDC.
  4. API проверяет, что токены, полученные от приложения, действительны и разрешают доступ.

Эти шаги упрощены; узнайте о реализации OIDC с PKCE у выбранного вами поставщика OIDC.

Наконец, между приложением и API требуется SSL, или, точнее, теперь TLS, иначе злоумышленник сможет увидеть данные и токены между приложением и API.

Ответ принят как подходящий

Недавно Firebase выпустила сервис под названием Firebase App Check Пожалуйста, посмотрите. Это может решить вашу проблему.

https://firebase.google.com/docs/app-check

Другие вопросы по теме