Среди официального списка кодов состояний HTTP есть такой код:
The request requires user authentication.
И разработчики ошибочно начинают его применять в ответах на REST-запросы асинхронные запросы, чтобы сообщить браузеру о том, что текущий пользователь их приложения не авторизован. Это в корне неверно.
В описании кода 401 ясно указано, что вместе с таким ответом сервер должен передать заголовок WWW-Authenticate
с перечнем условий. А браузер может повторить запрос, включив в него заголовок Authorization
с требуемыми для аутентификации данными.
Чаще всего в реальной жизни этот код можно встретить, если доступ к ресурсу защищён паролем. Например, в Apache это можно сделать добавив в конфигурацию следующие строки:
AuthName "Secure Area"
AuthType Basic
AuthUserFile "/usr/local/apache/passwd/passwords"
Require valid-user
Браузер попросит пользователя ввести логин и пароль и будет в дальнейшем их использовать для доступа ко всем ресурсам, защищенным такой базовой аутентификацией. Замечу, что введённые данные будут каждый раз передаваться в открытом виде в заголовках запросов.
Очевидно, что такая проверка уровня доступа пользователя к запрашиваемому ресурсу по протоколу HTTP никак не связана с разграничением прав пользователей внутри сервера приложения.
А как лучше?
По моему мнению, разумнее отвечать неавторизованному пользователю кодом 403 Forbiden
The server understood the request, but is refusing to fulfill it.
А в теле ответа передать JSON с описанием проблемы.
Коментарии к заметке
Какой код использовать если действие не разрешено?
Коды состояния HTTP про протокол, а не про приложение. Выбирайте «200» или «403». В любом случае в теле ответа нужно выдавать какую-то дополнительную информацию. Разница между этими кодами в том, что «200» нужно обрабатывать в колбеке
success
(или когда промис успешно разрешён), а «403» — в колбекеerror
(или когда промис отклонён).Не соглашусь с вами. 401 — это когда пользователь не авторизован (т.е. вообще не установлен), а 403 — это доступ запрещен (например пользователь авторизован, но у него нет определённых прав на просмотр чего-либо)
Мне кажется, что вы перепутали роли пользователя в приложении со статусом протолока HTTP.
Например, я могу защитить весь сайт от случайных пользователей базовой HTTP-авторизацией. Смотрите мой пример в статье. Прежде чем сервер отдаст браузеру хоть что-нибудь (HTML, стили, скрипты, картинки и т.п.), пользователь должен будет ввести логин и пароль. И только гораздо позже он сможет открыть страницу с формой логина и авторизоваться в приложении. Чувствуете разницу?