Среди официального списка кодов состояний 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 с описанием проблемы.