Подтвердить что ты не робот

Пароль, защищающий службу REST?

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

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

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

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

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

4b9b3361

Ответ 1

В настоящее время я разрабатываю 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 return code 401.

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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