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

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

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

К вопросу о том, как сделать аутентификацию RESTfully, люди обычно энтузиастски кричат ​​ "HTTP Authentication". Тем не менее, я сомневаюсь, что эти люди когда-либо пытались сделать приложение на основе браузера (вместо веб-службы "машина-машина" ) с помощью REST. (без обид - я просто не думаю, что они когда-либо сталкивались с осложнениями)

Проблемы, которые я обнаружил при использовании HTTP-аутентификации в службах RESTful, которые создают HTML-страницы для просмотра в браузере, следующие:

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

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

Я считаю, что файлы cookie - это решение. Но подождите, печенье злые, не так ли? Нет, это не так, как часто используются куки, это зло. Сам файл cookie - это всего лишь часть клиентской информации, точно так же, как информация об аутентификации HTTP, которую браузер будет отслеживать во время просмотра. И эта часть клиентской информации отправляется на сервер по каждому запросу, опять же, как и HTTP-аутентификация. Понятно, что единственное отличие состоит в том, что содержимое этой части клиентского состояния может быть определено сервером как часть его ответа.

Сделав сеансы ресурсом RESTful с помощью только следующих правил:

  • Сессия отображает ключ к идентификатору пользователя (и, возможно, метку времени последнего действия для тайм-аутов).
  • Если сеанс существует, это означает, что ключ действителен.
  • Вход означает POSTing to/sessions, новый ключ устанавливается как файл cookie
  • Выход из системы означает DELETEING/session/{key} (с перегруженным POST, помните, что мы - браузер, а HTML 5 - еще длинный путь)
  • Аутентификация выполняется путем отправки ключа в виде файла cookie при каждом запросе и проверки наличия и действительности сеанса

Единственное отличие от HTTP-аутентификации заключается в том, что ключ аутентификации генерируется сервером и отправляется клиенту, который продолжает его отправлять, вместо того, чтобы клиент его вычислял из введенных учетных данных.

Я считаю, что это достаточное решение, которое прекрасно работает, но я должен признать, что мне недостаточно эксперта по безопасности, чтобы определить потенциальные дыры в этой схеме. Все, что я знаю, это то, что используют сотни не-RESTful веб-приложений по существу тот же протокол входа ($ _SESSION inphp, HttpSession в j2ee и т.д.). Содержимое заголовка файла cookie просто используется для адресации ресурса на стороне сервера, так же как язык принятия может использоваться для доступа к ресурсам перевода и т.д. Я чувствую, что это то же самое, но, может быть, другие нет? Как вы думаете, ребята?

4b9b3361

Ответ 1

Интересный вопрос. Я заканчиваю реализацию REST API прямо сейчас - используя mod_rewrite и PHP. Он использует базовую аутентификацию HTTP через HTTPS. Пока мы работаем над клиентом Palm Pre. Парню, разрабатывавшему этого клиента, немного откладывалось, чтобы отслеживать учетные данные пользователя для отправки с каждым запросом.

Идея разоблачения СЕССИИ как ресурса интересна. В том числе это все равно будет нарушать строгие принципы RESTful. Даже если вы предоставляете SESSION в качестве ресурса, вы все равно будете использовать сервер для отслеживания состояния клиента. Строгое соблюдение REST, вероятно, потребует использования файлов cookie, так как постоянная память на стороне клиента доступна вам из браузера. Проблема заключается в том, что вы создаете клиент JavaScript (или FLASH?) Для управления HTTP-запросами на стороне клиента, если вы не хотите, чтобы пользователи взаимодействовали с собранным браузером сборами учетных данных HTTP.

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

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

... добавление к этому на 10/23/2012...

Методология RESTful, которая настаивает на том, чтобы клиент отслеживал свое состояние, не просто академичен. Это имеет важные последствия для масштабируемости и адресности открытых ресурсов. Когда я говорю это, я предполагаю, что по состоянию клиента мы говорим об атрибутах, специфичных для запрашивающего пользователя, которые влияют на ответы, выдаваемые интерфейсом (ов) RESTful. Одной из сильных сторон REST является его адресность. Когда вы делаете свои ответы каким-либо образом зависимыми от информации, не переданной в запросе, вы начинаете отрываться от этого. Просто запоздалая мысль... 3 года спустя, lol.

Ответ 2

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