Я должен разработать план разработки RESTful API (Python/Flask), который может использоваться нашим будущим веб-приложением (Angularjs) и мобильными приложениями (iOS/Android).
Я работаю три дня и сталкиваюсь с несколькими сценариями: Использование HTTPS - один из способов, описанных ниже, чтобы сделать его более безопасным. Но https медленнее, что может означать, что нам нужны более быстрые и дорогие серверы.
- Использование Basic-Http-Auth и отправка имени пользователя/пароля в обычном (но https) канале для каждого запроса API.
- Использование Digest-Auth, который является хешем пароля, и отслеживание будет автоматическим. Это будет работать для веб-приложения, однако я не смог подтвердить, поддерживает ли iPhone и Android это. Если они это сделают, это может быть простым решением!
- Использование пользовательского HTTP-заголовка, в котором я бы отправил пользовательскую строку Auth в заголовке http при успешной аутентификации. Но тогда я должен убедиться, что я отправляю этот код auth для каждого запроса, который пользователь делает. Это делает его точно так же, как 1) с той разницей, что простые пароли не используются, и код auth может истекать без какого-либо риска. Также проблематично отслеживание кода auth, который больше не автоматизирован, как в 2)
- Использование OAuth - это вариант. Но его довольно сложно настроить. Если нет лучшего способа, возможно, это единственный способ?
- Защита API как Amazon S3, как описано в этой отличной статье. Короче говоря, он говорит, что и сервер, и клиент будут знать секретный ключ, который они будут использовать для хэширования связи. Это будет похоже на рукопожатие гангстеров, что вы только доверяете мальчике доставки, если он знает рукопожатие гангста. Далее по комментариям кто-то спрашивает:
Как сохранить секретный ключ в безопасном приложении HTML5?
Вы совершенно правы; в чистом HTML5 (JS/CSS/HTML) приложении, нет защиты ключа. Вы будете общаться HTTPS, в этом случае вам не понадобится ключ, так как вы можете безопасно идентифицировать клиента с использованием стандартного API_KEY или другого дружественного идентификатор без необходимости или сложности HMAC.
Иными словами, на самом деле даже нет смысла использовать метод для веб-приложения. И, честно говоря, я не понимаю, как это должно работать на мобильном устройстве. Пользователь загружает наше приложение и как я могу отправить закрытый ключ из iphone на сервер? В тот момент, когда я его передал, он будет скомпрометирован.
Чем больше я исследую, тем более нерешительным я получаю.
Я надеялся спросить некоторых профессионалов, которые сделали это раньше и могли поделиться своим опытом. Большое спасибо