RESTful аутентификация

Asked
Viewd399809

755

Что такое аутентификация RESTful и как она работает? Я не могу найти хороший обзор в Google. Насколько я понимаю, вы передаете сеансовый ключ (постоянный) в URL-адресе, но это может быть ужасно неправильно.

14 ответов

12

Я думаю, что спокойная аутентификация включает передачу токена аутентификации в качестве параметра в запросе. Примерами являются использование apikeys API. Я не верю, что использование файлов cookie или http auth соответствует требованиям.

22

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

Самый простой способ добиться этого - начать со встроенных механизмов аутентификации HTTP, описанных в RFC 2617 а>.

420

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

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

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

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

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

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

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

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

converter42 добавляет, что при использовании https (что нам следует) важно, чтобы для файла cookie был установлен флаг безопасности, чтобы информация для аутентификации никогда не отправлялась через незащищенное соединение. Отличный момент, сам не видел.

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

2

Чтобы ответить на этот вопрос, насколько я понимаю ...

Система аутентификации, использующая REST, поэтому вам не нужно фактически отслеживать пользователей в вашей системе или управлять ими. Это делается с помощью HTTP-методов POST, GET, PUT, DELETE. Мы берем эти 4 метода и думаем о них с точки зрения взаимодействия с базой данных как CREATE, READ, UPDATE, DELETE (но в сети мы используем POST и GET, потому что это то, что в настоящее время поддерживают теги привязки). Итак, рассматривая POST и GET как наши CREATE / READ / UPDATE / DELETE (CRUD), мы можем создавать маршруты в нашем веб-приложении, которые смогут определить, какое действие CRUD мы выполняем.

Например, в приложении Ruby on Rails мы можем создать наше веб-приложение таким образом, что если пользователь, вошедший в систему, посещает http://store.com/account/logout , то GET этой страницы можно будет просмотреть, когда пользователь пытается выйти из системы. В нашем контроллере rails мы создадим действие, которое выводит пользователя из системы и отправляет его обратно на домашнюю страницу.

GET на странице входа приведет к появлению формы. POST на странице входа будет рассматриваться как попытка входа в систему, он будет принимать данные POST и использовать их для входа в систему.

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

Я все еще учусь. Если вы обнаружите, что я ошибаюсь, поправьте меня, а если вы узнаете больше, напишите об этом здесь. Спасибо.