Как предоставить угловую авторизацию моим REST API Calls для мобильного приложения
У меня есть бэкэнд C# Azure Web API, где данные извлекаются из внешнего Ionic Mobile App (которое в основном является Angular App)
Авторизация пользователей осуществляется через облачный сервис Ionic, поэтому они выполняют тяжелую работу по регистрации пользователей через FB, Twitter, basic (имя пользователя / пароль).
Мой вопрос заключается в том, что когда я обращаюсь к сервисам вызовов из моего внутреннего API, как я могу убедиться, что кто-то просто не читает жестко запрограммированное имя пользователя / пароль внутри внутреннего кода javascript для доступа к данным внутреннего интерфейса?
Я знаю, что это довольно далеко, но в любом случае API должен знать, что запрос на самом деле исходит от приложения (Android и iOS), а не только от того, кто пытается вставить данные и комментарии из неавторизованного веб-браузера?
2 ответа
Поскольку вы вызываете API из JavaScript, который доступен для конечных пользователей, вы можете предположить, что ваш JavaScript и все содержащиеся в нем логика / учетные данные доступны для всех.
Есть довольно безопасные способы обойти это, и FB/Twitter и их коллеги реализовали это (используя OAuth). По сути, при передаче учетных данных в API создается токен, который затем используется для последующих обращений к API вместо учетных данных.
Вы можете избежать случайного запуска "несанкционированных" запросов с использованием одноразовых номеров, которые генерируются при визуализации формы и могут использоваться только один раз для отправки рассматриваемой формы. Затем вы можете ограничить срок действия одноразового номера в конце API. К сожалению, это не надежно, но это ограничит урон любого вида атаки "грубой силой", которую вы можете получить.
Опять же, с любым общим "секретом" (который гарантировал бы происхождение запросов), вы должны предполагать, что любой человек, обладающий достаточной силой воли, сможет извлечь его из приложений, поэтому любой метод, который вы реализуете здесь, будет на 100% надежным. Вероятно, лучшее, что вы можете сделать, - это создать общий секрет, сгенерированный для каждого пользователя на каждом устройстве.
Краткий ответ: вы не можете.
Длинный ответ: вы можете (и должны) проверять поведение клиента, но не самого клиента.
Например, мы можем взглянуть на Pokemon Go: через несколько часов появились боты, способные играть, через пару недель Niantic начал работать инженером-программистом Machine Learning и шифровать свой API, используя unknown6
алгоритм для остановки бот, но через несколько дней трудолюбивого ботам пришел снова в Интернете.
Вы можете использовать все безопасные методы этой вселенной (с большими затратами), но если кто-то (кто имеет хорошие знания в области разработки программного обеспечения) захочет подражать вашему клиенту в конце, я достигну его цели