SSL имеет двухстороннюю аутентификацию, как уже упоминалось другими комментаторами.
Но я не думаю, что вы даже должны пытаться аутентифицировать клиента, иначе приложение. Вы аутентифицируете только пользователя (владельца ресурса в терминах Oauth), а не агента или клиента.
Это факт, что мобильные приложения не могут хранить никаких секретов. Поэтому никогда не ставьте сертификаты / пароли на устройстве. Типичным плохим примером может быть сохранение имени пользователя и пароля в некотором системном хранилище ключей, например, в IOS связке ключей. Если пользователь приложения не устанавливает пароль на телефоне, все хранилище ключей сохраняется в виде простого текста, и любой может сбросить всю информацию. Вставить сертификат в приложение практически одинаково плохо, так как в отличие от сервера мобильный телефон не заблокирован в компьютерной комнате. Люди их теряют.
Исходя из этого, вам необходимо решение на основе токенов, чтобы приложение не хранило секреты. Вы передаете секреты (учетные данные пользователя) и немедленно удаляете их из памяти. Вам нужно только держать токен, который будет недолгим (истекает через 30 минут и т. Д.)
Oauth 2.0 Неявный поток предназначен для решения этой проблемы. Тем не менее, это далеко не идеально. И есть некоторые фундаментальные проблемы со спецификацией Oauth 2.0. В частности, реализация этого потока требует, чтобы приложение использовало UIWebView (встроенный браузер), что само по себе может быть небезопасным и плохим для пользователя. Так что это в значительной степени устраняет все потоки на основе перенаправления Единственное известное приложение, которое использует поток перенаправления OAuth 2, - это Facebook, и оно сделано плохо.
Поток OAuth 2.0 Resource Owner является одним из вариантов. Благодаря такому потоку уровень безопасности всей вашей системы может быть таким же высоким, как у решения B2C - например, на основе решения для интернет-банкинга на основе браузера. Это означает, что любой пользователь с паролем имени пользователя сможет получить доступ к ресурсам на сервере - такой же уровень безопасности для решения на основе браузера.
Тем не менее, вы все равно должны быть осторожны, как упоминалось ранее, у спецификации OAuth 2 есть некоторые фундаментальные проблемы - в этом случае вы не можете следовать ее спецификации для реализации логики обновления токена - которая обычно включает использование никогда истекает токен обновления, который можно рассматривать как реализацию Google OAuth 2. Этот токен сам становится секретом - побеждает цель использования OAuth.
Одним из обходных путей является автоматическое обновление токена на основе последнего действия.
В любом случае, безопасность мобильных приложений вообще не является новой темой, но, к сожалению, у нас до сих пор нет стандартных инструментов / механизмов для решения этих уникальных задач.
Вот почему банки платят миллионы за решение для мобильного банкинга, и все же они терпят неудачу (http://hothardware.com/News/Mobile-Banking-Apps-for-iOS-Vulnerable-to-Man-in-the-Middle-Attacks/)
; -)