Пароль защищает службу REST?
После создания базовой службы REST я пришел к тому, что было бы целесообразно добавить какую-то защиту паролем, поскольку мне нужно убедиться, что мои пользователи правильно зарегистрированы и имеют достаточные разрешения для выполнения любого действия, которое они выполняют. собираюсь
Доступ к REST-сервису будет в основном осуществляться через интерфейс, насыщенный Javascript, и с учетом этого я предложил две следующие альтернативы для решения этой проблемы:
Заставьте пользователей войти, сначала отправив учетные данные
/login
страница сPOST
, Страница устанавливает cookie-файл сеанса, в котором пользователь помечен как вошедший в систему, а также уровень разрешений. При каждом следующем запросе я проверяю, вошел ли пользователь в систему и имеет ли он / она уровень разрешений. Когда сеанс истекает, автоматически или вручную (выход из системы, пользователь должен будет повторно войти в систему).Временно сохраните учетные данные, хэшированные локально, и отправляйте учетные данные пользователей по каждому отдельному запросу, сделанному пользователем, для проверки серверной части учетных данных и разрешений для каждого запроса.
Есть ли еще способы решить эту проблему, и есть ли что-то еще, что меня должно волновать?
5 ответов
В настоящее время я разрабатываю REST API вместе с клиентом (написанным на 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
затем сохраните это значение в переменной и отправляйте при каждом последующем запросе.
Если вы хотите остаться верным определению службы REST, тогда она должна быть без сохранения состояния и не хранить никаких данных для входа (или других специфических для контекста) данных на сервере: http://en.wikipedia.org/wiki/Representational_state_transfer
Ваш второй подход будет соответствовать этой модели
Сначала решите, от чего вы защищаетесь:
- Аутентификация? (Зная, кто запрашивает вашу услугу?)
- Авторизация? (Может ли данное лицо правильно запросить данную услугу или нет?)
Я рекомендую вам предоставить хешированные ключи для вашего сервиса. Таким образом, вы можете управлять ключевым вопросом отдельно от сервисов. Или клиентский ключ и секрет, Amazon делает это.
Клиенту всегда легче, если у вас есть протокол без сохранения состояния. И отправлять все через параметры, куки тоже мешают клиенту.
Помните, что в ваших интересах сделать так, чтобы потенциальные разработчики могли как можно проще использовать ваш сервис. Супер-безопасный сервис, которым никто не пользуется, скучен.
Вы можете позволить клиентам выбирать уровень безопасности, предоставляя им выбор конечных точек HTTP или SSL/HTTP для подключения. Выбор клиента - это хорошо.
Заставьте пользователей войти, сначала отправив учетные данные на страницу входа в систему / POST. Страница устанавливает cookie-файл сеанса, в котором пользователь помечен как вошедший в систему, а также уровень разрешений. При каждом следующем запросе я проверяю, вошел ли пользователь в систему и имеет ли он / она уровень разрешений. Когда сеанс истекает, автоматически или вручную (выход из системы, пользователь должен будет повторно войти в систему).
Временно сохраните учетные данные, хэшированные локально, и отправляйте учетные данные пользователей по каждому отдельному запросу, сделанному пользователем, для проверки серверной части учетных данных и разрешений для каждого запроса.
Ваш первый подход не устраняет ограничения на безгражданство REST. Вы не можете поддерживать клиентские сессии на стороне сервера. Это ограничение делает REST легко масштабируемым...
Ваше второе решение подходит. Самый простой способ использовать базовую аутентификацию HTTP. Вам не нужно хешировать пароль на стороне клиента. Что вам нужно, это зашифрованное соединение. На стороне сервера вы можете иметь [username, password] -> [identity, permissions]
кеш, так что это решение намного быстрее и превосходит другие способы, чем сеансы на стороне сервера.
Для сторонних (ненадежных) клиентов аутентификация является более сложной, я думаю, вам не нужна эта часть.
Я не эксперт по безопасности. Я использую RESTful Play!-Webframework, и они делают следующее для аутентификации пользователей.
- Файл cookie защищен от манипуляций. Он подписан длинным секретным ключом и проверяется для каждого запроса. Просто хеширования недостаточно!
- Они рекомендуют устанавливать уникальную информацию, идентифицирующую пользователя в куки. Поскольку сервер должен единственный, кто манипулирует cookie, этого достаточно.
- Не помещайте пароль в качестве учетных данных в куки. Если кто-то прослушивает cookie-файл, может быть взломан не только сеанс, но и полная учетная запись или, что еще хуже, другие учетные записи с такими же учетными данными.
Если вы хотите защитить куки от перехвата с помощью https.