Похоже, существует много путаницы относительно правильного кода статуса http, который должен возвращаться, если пользователь пытается получить доступ к странице, которая требует от пользователя входа в систему.
Итак, какой код состояния будет отправлен, когда я покажу страницу входа?
Я почти уверен, что нам нужно использовать код состояния в диапазоне 4xx
.
Я не говорю здесь о HTTP-аутентификации, поэтому по крайней мере один код состояния мы использовать не будем (401 Unauthorized
).
Итак, что мы должны использовать? Ответы (также здесь на SO), кажется, разнятся:
Согласно ответу здесь мы должны использовать 403 Forbidden
.
Но в описании кода статуса есть:
Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться.
Что ж, похоже, что это не то, что нужно. Поскольку авторизация ДОЛЖНА помочь.
Так что давайте посмотрим другой ответ. Ответ здесь даже не использует диапазон 4xx
, а использует 302 Found
Описание кода статуса 302 Found
:
Запрашиваемый ресурс временно находится под другим URI. Поскольку перенаправление может быть изменено, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов. Этот ответ можно кэшировать только в том случае, если на это указывает поле заголовка Cache-Control или Expires.
Я думаю, что это также не то, чего я хочу. Поскольку это не запрашиваемый ресурс, который находится под другим URI. А скорее совершенно другой ресурс (страница входа в систему против страницы аутентифицированного контента).
Поэтому я пошел дальше и выбрал другой ответ, на удивление, с другим решением.
Этот ответ предлагает нам выбрать 400 Bad Request
.
Описание этого кода состояния таково:
Запрос не может быть понят сервером из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений.
Я думаю, что сервер прекрасно понял запрос, но просто отказывается предоставлять доступ, пока пользователь не прошел аутентификацию.
В другом ответе также говорится, что ответ 403
является правильным, однако в конце говорится:
Если это публичный сайт, где вы пытаетесь запретить доступ на основе сессионного cookie [именно так я и делаю], то часто лучше всего использовать 200 с соответствующим телом, указывающим на необходимость входа в систему, или временное перенаправление 302 на страницу входа в систему.
Так что 403
- это правильно, но 200
или 302
- это ЛУЧШЕ.
Эй! Это то, что я ищу: ЛУЧШЕЕ решение. Но разве лучшее не должно быть тем же самым, что и правильное? И почему оно должно быть лучшим?
Спасибо всем, кто дошел до этого вопроса :)
Я знаю, что мне не стоит слишком беспокоиться об этом. И я думаю, что этот вопрос более гипотетический (не совсем, но использовал его за неимением лучшего слова).
Но этот вопрос преследует меня уже некоторое время.
И если бы я был менеджером (который просто подобрал несколько круто звучащих слов, как они всегда делают), я бы сказал: но, но, но, но, но отдых важен. :-)
Итак: каков правильный способ™
использования кода статуса в описанной выше ситуации (если таковой имеется)?
tl;dr
Каков правильный ответ кода состояния http, когда пользователь пытается получить доступ к странице, требующей входа?