2011-12-19 5 views
13

После создания базовой службы REST я подошел к точке, где было бы целесообразно добавить некоторую защиту паролем, так как мне нужно проверить, что мои пользователи правильно зарегистрированы и имеют достаточные разрешения для выполнения любого действия они собираются.Пароль, защищающий услугу REST?

Служба REST в основном будут доступны из Javascript-тяжелых веб-интерфейсе и с этим в виду, я пришел с двумя следующими альтернативами для решения этой проблемы:

  1. Сделать пользователей войти в систему с помощью первой отправки учетных данных на страницу /login с POST. Страница устанавливает cookie сеанса, в котором пользователь имеет , помеченный как зарегистрированный, вместе с уровнем разрешений. По каждому запросу я проверяю, что пользователь вошел в систему и его/ее уровень . Когда сеанс истекает, автоматически или вручную (выход из системы, пользователь должен будет повторно войти в систему).

  2. Временно сохранять учетные данные, хранящиеся локально, и отправлять учетные данные пользователей по каждому отдельному запросу пользователя, чтобы проверить учетные данные & с правами доступа на основе запроса.

Есть ли еще способы решить эту проблему и есть ли что-то еще, что я должен беспокоить?

+0

Если ваш бэкэнд находится на Java, вы также можете использовать [Apache Shiro] (http://shiro.apache.org/), он прекрасно справится с большинством ваших проблем. – pierpytom

ответ

17

В настоящее время я разрабатываю API REST вместе с клиентом (написано в javascript), ниже я попытаюсь объяснить методы, используемые для защиты API от несанкционированного доступа.

  • Сделайте REST API требовать Auth-Key заголовка при каждом запросе к API, кроме /api/authenticate.

  • /api/authenticate принимает имя пользователя и пароль (отправляется с использованием POST) и возвращает информацию о пользователе вместе с Auth-Key.

  • Этого Auth-Key генерируется случайным образом после вызова /api/authenticate и хранится в таблице бэкенда users с конкретной записью пользователя, md5 хэшем удаленного IP + агентом пользователя, предоставленным клиентом.

  • По всем запросам стоимость Auth-Key и md5 указанная сумма, найдена в users. Если действительный пользователь найден, который был активным в течение последних N минут пользователь будет предоставлен доступ, если нет: HTTP код возврата 401.

  • В клиенте REST, сначала получить Auth-Key, разместив /api/authenticate, то сохраните это значение в переменной и отправьте на каждый будущий запрос.

+0

Благодарим вас за ответ. Как вы справляетесь с истечением срока действия ключей + возможное автоматическое продление? – Industrial

+0

@ Промышленный Истечение ключей обрабатывается другим полем 'last_access' в' users'-таблице, при поиске указанного 'Auth-Key' у меня также есть высказывание' WHERE' claus; 'WHERE last_access> (UNIX_TIMESTAMP() - (N * 60))' –

+0

@ Индустриальный Вы ищете более сложный ответ, или это текущая должность достаточна? (Я спрашиваю, потому что он не отмечен как принятый, и если вы хотите, я могу предоставить вам дополнительную информацию) –

3

Если Вы хотите, чтобы остаться верным определение службы REST, то он должен быть лицом без гражданства и не хранит логин (или другой контекст конкретного) данные на сервере: http://en.wikipedia.org/wiki/Representational_state_transfer#Constraints

Вашего второй подход будет соответствовать этой модели

0

Я не специалист по безопасности. Я использую RESTful Play! -webframework, и они выполняют следующие действия для аутентификации пользователей.

  1. Печенье защищено от манипуляций. Он подписан длинным секретным ключом и проверяется для каждого запроса. Просто хэширования недостаточно!
  2. Они рекомендуют установить уникальную информацию, идентифицирующую пользователя в файле cookie. Поскольку сервер должен быть единственным, кто может манипулировать файлом cookie, этого достаточно.
  3. Не вводите пароль в качестве регистрационного файла в файле cookie. Если кто-то нюхает куки, не только сеанс может быть захвачен, но и полная учетная запись или, что еще хуже, другие учетные записи с одинаковыми учетными данными.

Если вы хотите защитить печенье от угона с помощью https.

1

Сначала решите, что это то, что вы защищаете против:

  • аутентификации? (Зная, кто запрашивает вашу услугу?)
  • Авторизация? (Может ли данное лицо должным образом запросить данную услугу или нет?)

Я рекомендую вам предоставить хешированные ключи для вашего обслуживания. Таким образом, вы можете управлять ключевой проблемой отдельно от служб. Или клиентский ключ и секрет, Amazon делает это.

Клиенту всегда проще, если у вас есть протокол без учета состояния. И отправляйте все через параметры, cookie также беспокоит клиента.

Помните, что в ваш заинтересован в том, чтобы сделать его максимально простым для потенциальных разработчиков, чтобы воспользоваться вашим сервисом. Супербезопасный сервис, который никто не использует, скучен.

Вы можете позволить клиентам выбрать уровень безопасности, предоставив им возможность выбора HTTP или SSL/HTTP-терминалов для подключения. Выбор клиента - это хорошо.

0
  1. Сделать пользователей войти в систему с помощью первой отправки учетных данных на странице/авторизации с POST. На странице задается файл cookie сеанса, в котором пользователь помечается как при входе в систему вместе с уровнем разрешений. При каждом следующем запросе я проверяю, что пользователь вошел в систему и его/ее разрешение . Когда сеанс истекает, автоматически или вручную (выход из системы, пользователь должен будет повторно войти в систему).

  2. Временно сохранить учетные данные хэш-локально и отправлять учетные данные пользователей по каждой просьбе, пользователю для проверки учетных данных & разрешений бэкенд на основе каждого запроса.

Ваш первый подход не Мясо statelessness constraint отдыхайте. Вы не можете поддерживать сеансы клиентов на стороне сервера.Это ограничение делает REST очень масштабируемым ...

Ваше второе решение подходит. Самый простой способ использования HTTP basic auth. Вам не нужно указывать пароль на стороне клиента. Вам нужно зашифрованное соединение. На стороне сервера у вас может быть кеш [username, password] -> [identity, permissions], поэтому это решение намного быстрее и превосходит всех остальных, чем сеансов на стороне сервера.

От сторонних (без доверенных) клиентов аутентификация более сложна, я думаю, вам не нужна эта часть.

Смежные вопросы