Аутентификация веб-приложения для серверной части REST API

В настоящее время я нахожусь на ранних этапах создания веб-приложения (HTML5, JS и т. д.), которое использует REST API на серверной части (Java, в частности, Jersey v1.18). Характер данных, которые будут храниться, очень важен, поэтому безопасность — это то, на что я начал обращать внимание, хотя приложение находится только на ранних стадиях. Конечная цель будет состоять в том, чтобы также иметь собственные мобильные приложения и потенциально предоставлять доступ к данным для внешних клиентов через тот же API.

В своем исследовании я выявил множество методов аутентификации, в том числе HTTP Basic, на основе токенов, файлы cookie сеанса, OAuth, HMAC и т. д. Ключевым компонентом здесь является то, что REST API будет в первую очередь использоваться пользователями, а не другие приложения или серверные части. Таким образом, наличие эквивалента «вход/выход» важно, и это сводится к аутентификации на уровне пользователя.

На данный момент аутентификация HMAC выглядит наиболее многообещающей, поскольку на данный момент у нас нет планов по интеграции с каким-либо провайдером OAuth.

Я уже прочитал десятки сообщений SO, а также такие статьи, как: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/ http://www.errant.me.uk/blog/2013/04/authenticating-restful-web-applications/ (примечание: это явно плохо, так как солить имя пользователя не рекомендуется)

В идеале HMAC кажется подходящим вариантом, но я еще не видел рекомендуемого подхода к работе с общим секретом. Идея использования ресурса для проверки учетных данных, который затем предоставляет токен/одноразовый номер для использования со схемой HMAC, кажется вариантом, но я сомневаюсь в преимуществах по сравнению с использованием этого токена/одноразового номера исключительно в качестве токена.

Я знаю, что аутентификация HMAC для REST API подробно обсуждалась, но при использовании в сочетании с деталями аутентификации, которые ожидают пользователи (имя пользователя, адрес электронной почты, пароль и т. д.), существует ли какой-либо рекомендуемый подход, который не требуется предварительно общий секретный ключ?


person Matt Joseph    schedule 18.03.2014    source источник


Ответы (1)


Это в первую очередь вопрос, основанный на мнении, но я предлагаю свои пять копеек: просто выберите файл cookie сеанса.

Если ваша основная аудитория — люди, и вам не нужно интегрироваться с третьими сторонами, не беспокойтесь об OAuth. Просто убедитесь, что ваш API доступен только через HTTPS, и выдайте токен сеанса, который сервер может отозвать после входа в систему. Строго говоря, это не обязательно должен быть файл cookie; Я видел API, которые прячут токен в хранилище сеансов HTML5 и предоставляют его в заголовке авторизации или в качестве параметра запроса.

Если у вас правильно настроен SSL, ваши пользователи получат ожидаемый замок в браузере, и вы будете в безопасности от любого, кто находится между вами и клиентом. Если клиент скомпрометирован, вы все равно облажались. А так как клиент не может хранить секреты, у более сложных схем HMAC не так много преимуществ.

person Tom G    schedule 18.03.2014
comment
Есть ли какой-нибудь фреймворк, который вы бы порекомендовали, который хорошо работает с Джерси? Я просмотрел Apache Shiro, Spring Security, Apache Oltu и использовал базовую аутентификацию HTTP как часть Джерси. - person Matt Joseph; 18.03.2014
comment
Для чего-то такого простого я бы использовал базовый фильтр сервлета или аналогичный. Просто сначала отправьте запросы к аутентифицированным конечным точкам в фильтр и отклоните с ошибкой 401, если токена нет. Очевидно, что если у вас есть логика авторизации для конкретного домена, вам все равно придется обрабатывать ее для каждого ресурса. - person Tom G; 18.03.2014