HTTP 401 не авторизован или 403 запрещен для «отключенного» пользователя? - PullRequest
26 голосов
/ 10 февраля 2012

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

Если сервер затем получает запрос на аутентификацию для отключенного пользователя, который в противном случае был бы действительным, должен ли сервер возвращать 401 или 403? С любым кодом состояния я вернул бы сообщение, указывающее, что учетная запись была отключена.

Для быстрого ознакомления, соответствующие цитаты из HTTP / 1.1 spec (выделено мной):

401 Несанкционированный

Запрос требует аутентификации пользователя. Ответ ДОЛЖЕН включать Поле заголовка WWW-Authenticate (раздел 14.47), содержащее запрос применимо к запрашиваемому ресурсу. Клиент МОЖЕТ повторить запрос с подходящим полем заголовка Авторизация (раздел 14.8). Если в запрос уже включены полномочия авторизации , затем 401 ответ указывает, что авторизация была отклонена для тех, Полномочия . Если ответ 401 содержит ту же проблему, что и предыдущий ответ, и пользовательский агент уже попытался аутентификации хотя бы один раз, тогда пользователю СЛЕДУЕТ представить сущность, которая была дана в ответе , так как эта сущность может включите соответствующую диагностическую информацию. HTTP-аутентификация доступа объясняется в разделе «HTTP-аутентификация: базовый и дайджест-доступ» Аутентификация "[43].

403 Запрещено

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

Ответы [ 3 ]

41 голосов
/ 14 февраля 2012

На основании электронного письма , написанного Роем Т. Филдингом , очевидно, ошибка в текущей спецификации HTTP.

Способспецификация предназначена для чтения следующим образом (используя цитаты из вышеупомянутого письма):

401 "Неаутентифицировано" :

Вы не можете сделать это, потому что вы не аутентифицировались

403 "Несанкционировано" :

пользовательский агент отправил действительные учетные данные, но неиметь доступ

Таким образом, в случае отключенного пользователя, 403 является правильным ответом (и 404 также является опцией).

11 голосов
/ 10 февраля 2012

У меня есть два разных ответа на вопрос, что вернуть в этом случае.

Семантический выбор - 401 Несанкционированный.В этом случае ваш клиент предоставил учетные данные, и запрос был отклонен на основании определенных учетных данных.Если клиент попытается снова с другим набором учетных данных, или если учетная запись должна быть повторно включена в будущем, тот же запрос может быть выполнен успешно.

Выбор безопасности - 404 Не найдено.Многие сервисы просто возвращают 404 за любой сбой, чтобы избежать утечки информации.Github сразу приходит мне в голову.

Из Общая информация об API , в документации разработчика Github:

Запросы без аутентификации вернут 404, чтобы предотвратить любую личную информацию.утечка.

Для чего-то, что я развертывал в качестве публичной службы, я бы, вероятно, согласился использовать 404, чтобы не дать злоумышленнику подсказки об их попытках удостоверения.Если бы это было только для внутреннего потребления, или в тестировании, я бы, вероятно, вернул 401.

2 голосов
/ 10 февраля 2012

технически оба верны, это действительно сводится к тому, сколько вы хотите раскрыть.

возврат 401 говорит вызывающей стороне, что учетная запись неверна, что правильно, но если ваш APIзатем будет вызван снова, чтобы зарегистрировать пользователя с теми же учетными данными, что вызов также не удастся.что может быть не очень полезно для звонящего.

так, это действительно зависит от того, как будет использоваться ваш API и кто / что является целевой аудиторией.

...