Как защитить частный REST API в приложении AJAX
Я знаю, что есть много похожих вопросов, но ни один из них не ссылается на приложение HTML/javascript, где пользователь может получить доступ к этому коду.
У меня есть частный REST API, написанный в nodejs. Он является частным, потому что его единственная цель - сервер моих приложений для клиентов HTML5 (приложение Chrome и приложение Adobe Air). Таким образом, ключ API не является хорошим решением, поскольку любой пользователь может видеть код javascript.
Я хочу, чтобы боты не создавали учетные записи на моем сервере и не потребляли мои ресурсы.
Есть ли способ сделать это?
Ответы
Ответ 1
Ключ API - достойное решение, особенно если вам требуются ограничения на начало запроса ключа API; что вы должны принимать только API-ключ, если исходный веб-запрос поступает из авторизованного источника, такого как ваш частный домен. Если веб-запрос поступает из неавторизованного домена, вы можете просто отказаться от обработки запроса.
Вы можете улучшить безопасность этого механизма, используя специальную схему кодирования, такую как код аутентификации сообщения хэш-кода (HMAC). Следующий ресурс ясно объясняет этот механизм:
http://cloud.dzone.com/news/using-api-keys-effectively
Ответ 2
Что вы хотите сделать, это использовать SSL с взаимным подтверждением, так что ваш сервер будет принимать входящие соединения только от вашего приложения, и ваше приложение будет связываться только с вашим сервером.
Вот высокоуровневый подход. Создайте сертификат SSL с самозаверяющим сервером и разверните его на своем веб-сервере. Если вы используете Android, вы можете использовать keytool, входящий в комплект Android SDK для этой цели; если вы используете другую платформу приложений, аналогичные инструменты существуют и для них. Затем создайте самозаверяющий клиент и разверните его в своем приложении в пользовательском хранилище ключей, включенном в ваше приложение, в качестве ресурса (keytool также будет генерировать это приложение). Настройте сервер, требующий аутентификации на стороне клиента, и только принять сертификат клиента, который вы создали. Настройте клиента для использования этого сертификата на стороне клиента для идентификации себя и принимайте только тот серверный сертификат, который вы установили на своем сервере для этой части.
Если кто-то, кроме вашего приложения, пытается подключиться к вашему серверу, соединение SSL не будет создано, так как сервер отклонит входящие SSL-соединения, которые не представляют сертификат клиента, который вы включили в ваше приложение.
Шаг за шагом для этого является гораздо более длинным ответом, чем это требуется здесь. Я бы предложил сделать это поэтапно, так как в Интернете есть ресурсы о том, как работать с самоподписанным SSL-сертификатом в Android (я не так хорошо знаком с тем, как это сделать на других мобильных платформах), как на стороне сервера, так и на стороне клиента. В моей книге "Безопасность приложений для платформы Android", опубликованной O'Reilly, также есть полная версия.