Как защитить API RESTful - программирование
Подтвердить что ты не робот

Как защитить API RESTful

Я искал способ защитить свои API RESTful. Это казалось простым, но, похоже, это не так просто. Во-первых, я пишу приложение iOS, подключающееся к серверу Play Framework. Ничто из этого не имеет ничего общего с Google, Facebook, Twitter или LinkedIn (шокирует, что я знаю). О, и мои текущие планы не требуют, чтобы пользовательские приложения использовали мои API-интерфейсы, это только мои приложения на данный момент.

Основная проверка подлинности

То, что казалось простым, было основным пользователем/передачей по методу /auth, управляющему сеансом cookie. Это может сделать некоторые стоны как слишком простые или слабые, но в основном это переместило идентификатор на ключ сеанса, который быстро проверяется. Моя первоначальная настройка заключалась в том, чтобы истекать сессии каждый день, но это привело к тому, что приложение iOS заставляло логин ежедневно доказывать свою досаду.

OAuth

Я разместил вопрос на плате iOS и получил тупое направление к OAuth. Мои исследования OAuth начались, но святой sh * t является настолько сложным и, похоже, не существует каких-либо примеров на стороне сервера... просто много людей жалуются на то, как это расстраивает. Все примеры клиентов показывают подключение к Google, Facebook, Twitter и LinkedIn. О, Радость!

После просмотра выступления Эрана Хаммера о OAuth1 и OAuth2, казалось бы, бесплодно продолжать, и его идея OZ (которая выглядит действительно чистой) находится только на ранних этапах в node.js.

Вопрос

Итак, мой вопрос к большому сообществу StackOverflow... что вы делаете для защиты ваших REST API?

4b9b3361

Ответ 1

Я бы предложил рассмотреть подход, используемый крупнейшими игроками, то есть Amazon Web Services или Windows Azure - HMAC. Хотя это не удобно в реализации, так как вы можете видеть, что это надежная техника.

Общая идея состоит в том, чтобы подписать части запроса (то есть заголовки) в iOS с помощью секретного ключа и попытаться пересчитать его в приложении Play, чтобы убедиться, что запрос аутентичен и не обрабатывается. Если это не подведет, вы можете быть (почти) уверены, что был отправлен от кого-то, кто использует действительный секретный ключ.

Взгляните на документ Windows, чтобы получить концепцию (я думаю, что для общей задачи вы можете использовать меньшее количество используемых элементов для подписания).

Существует и другая интересная публикация (основанная на аутентификации AWS), которая еще лучше описывает весь процесс.

Edit

Конечно, вы должны понимать, что аутентификация в iOS и защита запросов API - это разные вещи, даже если вы истекаете свою сессию каждые 15 минут, вы не можете быть уверены, что кто-то ее не подслушает, а затем сможет для отправки поддельного запроса извне. Подписание каждого запроса должно минимизировать риск.

С другой стороны, если вы подготовите четкие правила для подписания запросов и напишите короткий документ (который я рекомендую даже для себя), вы можете доставить его другому разработчику, и он сможет его реализовать в (почти) любой платформе, поддерживающей SHA256, поэтому у вас будет готовый API для использования от 3-х партийных приложений - если вы решите опубликовать его в будущем.

Ответ 2

Так как Play Framework находится на Java, вы можете использовать Apache Shiro

Я еще не использовал его. (Я планирую хотя). Поэтому я не знаю, лучший ли это вариант.

Ответ 3

Просто сделайте что-то простое, отправьте код авторизации/пароль в пользовательский заголовок поверх HTTPS.

Ответ 4

Итак, единственная проблема с подходом Basic Authentication заключалась в том, что пользователь должен каждый день регистрироваться? Почему бы не предложить пользователю возможность сохранить его имя пользователя/пароль на устройстве? Таким образом, он может выбирать между безопасностью и удобством.