Можете ли вы помочь мне понять это? "Общие ошибки REST: сеансы неактуальны"

Отказ от ответственности: я новичок в школе мысли REST, и я пытаюсь обдумать ее.

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

Клиент не должен нуждаться в клиенте "войти" или "начать соединение". Проверка подлинности HTTP автоматически при каждом сообщении. клиент приложения являются потребителями ресурсов, а не услуг. Следовательно нечего входить в систему! Давайте скажите, что вы бронируете рейс на Веб-сервис REST. Вы не создаете новое "сеансовое" подключение к оказание услуг. Скорее вы спрашиваете "маршрут создатель объекта", чтобы создать новую маршрут. Вы можете начать заполнять пробелы, но затем получить некоторые полностью другой компонент в другом месте на чтобы заполнить некоторые другие пробелы. Нет сеанса, поэтому нет проблема миграции состояния сеанса между клиентами. Также нет вопрос о "близости сессии" в сервера (хотя есть еще нагрузка вопросы балансировки продолжаются).

Хорошо, я получаю, что HTTP-аутентификация выполняется автоматически при каждом сообщении, но как? Является ли имя пользователя/пароль отправлено с каждым запросом? Разве это не увеличивает площадь поверхности атаки? Я чувствую, что мне не хватает части головоломки.

Было бы плохо, если бы служба REST, скажем, /session, которая принимает запрос GET, где вы передаете имя пользователя/пароль как часть запроса, и возвращает токен сеанса, если аутентификация была успешный, который затем может быть передан вместе с последующими запросами? Имеет ли это смысл с точки зрения REST, или это отсутствует точка?

Ответ 1

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

Хорошо, я получаю эту HTTP-аутентификацию выполняется автоматически при каждом сообщении - но как?

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

Было бы плохо, если бы REST службы, скажем,/сессии, которая принимает GET, где вы пройдете имя пользователя/пароль как часть запрос и возвращает токен сеанса если аутентификация прошла успешно, которые затем могут быть переданы вместе с последующие запросы? Это делает с точки зрения REST, или что отсутствует точка?

Это не будет RESTful, поскольку оно носит состояние, но, тем не менее, оно довольно распространено, поскольку это удобство для пользователей; пользователю не нужно входить в систему каждый раз.

То, что вы описываете в "токене сеанса", обычно называется cookie входа. Например, если вы попытаетесь войти в свой Yahoo! отметьте там галочку, в которой говорится: "Держите меня зарегистрированным в течение 2 недель". Это, по существу, говорит (по вашим словам) "продолжайте мой токен сеанса в течение 2 недель, если я войду в систему". Веб-браузеры отправят такие файлы cookie для входа (и, возможно, другие) с каждым запросом HTTP, который вы попросите сделать для вас.

Ответ 2

Нередко для службы REST требуется проверка подлинности для каждого HTTP-запроса. Например, Amazon S3 требует, чтобы каждый запрос имел подпись, которая была получена из учетных данных пользователя, точного запроса на выполнение и текущего времени. Эта подпись легко вычисляется на стороне клиента, может быть быстро проверена сервером и имеет ограниченное применение для злоумышленника, который ее перехватывает (поскольку он основан на текущем времени).

Ответ 3

Многие люди не понимают принципов REST очень четко, используя токен сеанса, не означает, что вы всегда с тоской, причина отправки имени пользователя/пароля с каждым запросом выполняется только для аутентификации и того же для отправки токена ( сгенерированный процессом входа в систему), чтобы решить, имеет ли клиент разрешение на запрос данных или нет, вы нарушаете только КОНЕЦ REST, когда используете пользовательские имя пользователя/пароль или токены сеанса, чтобы решить, какие данные показывать! вместо этого вы должны использовать их только для проверки подлинности (чтобы показать данные или не показывать данные)

в вашем случае я говорю ДА, это RESTy, но старайтесь избегать использования собственных php-сессий в REST API и начинайте генерировать свои собственные хеш-маркеры, срок действия которых истекает в определенный период времени!

Ответ 4

Нет, это не упущено. Google ClientLogin работает именно таким образом с заметным исключением, что клиенту поручено перейти на "сеанс" с помощью ответа HTTP 401. Но это не создает сеанс, он только создает способ для клиентов (временно) аутентифицироваться самостоятельно, не передавая учетные данные в ясности, а для сервера - контролировать достоверность этих временных учетных данных по своему усмотрению.

Ответ 5

Хорошо, я получаю эту HTTP-аутентификацию выполняется автоматически при каждом сообщении - но как?

"Авторизация:" HTTP-заголовок отправляется клиентом. Либо базовый (обычный текст), либо дайджест.

Было бы плохо, если бы REST службы, скажем,/сессии, которая принимает GET, где вы пройдете имя пользователя/пароль как часть запрос и возвращает токен сеанса если аутентификация прошла успешно, которые затем могут быть переданы вместе с последующие запросы? Это делает с точки зрения REST, или что отсутствует точка?

Вся идея сеанса состоит в том, чтобы сделать приложения с состоянием, используя протокол без учета состояния (HTTP) и немой клиент (веб-браузер), поддерживая состояние на стороне сервера. Одним из принципов REST является "Каждый ресурс однозначно адресуется с использованием универсального синтаксиса для использования в гипермедиальных ссылках". Переменные сеанса - это то, к чему нельзя получить доступ через URI. Поистине RESTful приложение будет поддерживать состояние на стороне клиента, отправляя все необходимые переменные через HTTP, предпочтительно в URI.

Пример: поиск с разбивкой по страницам. У вас есть URL-адрес в форме

http://server/search/urlencoded-search-terms/page_num

Он имеет много общего с URL-адресами для закладок

Ответ 6

Я думаю, что ваше предложение в порядке, если вы хотите контролировать время жизни сеанса клиента. Я думаю, что архитектура RESTful поощряет вас разрабатывать приложения без гражданства. Как пишет @2pence, "каждый HTTP-запрос должен содержать достаточно информации сам по себе, чтобы его получатель обрабатывал его в полной гармонии с апатрийностью HTTP".

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