Что такое правильный ответ HTTP для отправки на запросы, которые требуют SSL / TLS - PullRequest
45 голосов
/ 31 марта 2010

Я разрабатываю RESTful API, где некоторые вызовы общедоступны по HTTP, а некоторые требуют ключа API и шифрования по HTTPS. Я размышляю над тем, какой код ответа следует отправлять, если HTTP-запрос отправляется на один из частных ресурсов. Пока что единственное, что бросается мне в глаза, это 412 - Предварительное условие не выполнено , но стандарт указывает, что предварительное условие налагается запрашивающей стороной, а не сервером.

Существует ли соответствующий код ответа для этого условия, или мне просто нужно сдаться и сделать 400 ?

Ответы [ 5 ]

28 голосов
/ 01 апреля 2010

Я не могу сказать, широко ли это принято клиентами HTTP, но, строго говоря, RFC, сервер должен ответить:

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

Источник:
http://tools.ietf.org/html/rfc2817#section-4.2

6 голосов
/ 31 января 2014

Наиболее безопасный способ заставить HTTP-клиент использовать HTTPS - HTTP Strict Transport Security .

Ранее распространенным предложением было прекращение соединения, но эта практика была удалена в пользу HSTS (веб-сайт OWASP).

6 голосов
/ 31 марта 2010

Соответствующий код ошибки для возврата будет похож на 403.4 - требуется SSL .

Хотя это явно не задокументировано в RFC для HTTP 1.1 , это поведение соответствует изложенным там требованиям:

Сервер понял запрос, но отказывается его выполнить. Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться. Если метод запроса не был HEAD и сервер желает сообщить, почему запрос не был выполнен, он ДОЛЖЕН описать причину отказа в объекте. Если сервер не желает предоставлять эту информацию клиенту, вместо него можно использовать код состояния 404 (не найден).

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

Итак, ваше последнее сообщение об ошибке будет выглядеть примерно так: «403 - Частный ресурс». Обратите внимание, что даже в случае отсутствия ключа API «401 - неавторизованный» не следует использовать, если только ваш ключ API фактически не может быть передан в поле заголовка WWW-Authenticate.

4 голосов
/ 20 января 2016

Возвращение 403 с формулировкой причины " Требуется HTTPS " кажется практичным вариантом и тем, что я использую.

см. https://en.wikipedia.org/wiki/HTTP_403

Перенаправление REST Api не очень хорошая идея, тем более что вы можете не иметь представления о том, как или что потребляет ваш сервис.

0 голосов
/ 01 апреля 2010

Просто отправьте перенаправление на соответствующий https: URI.

UPDATE

Это неправильный ответ - см. Комментарии ниже

...