Какой HTTP-код использовать в случаях "Не аутентифицирован" и "Не разрешен"?
Я читал, что "401 Unauthorized" код должен использоваться, когда пользователь:
- Не регистрируется, но требуется логин ( "не аутентифицирован" );
- Записано, но его профиль не позволяет увидеть этот URL ( "не авторизован" );
Согласно RFC, в обоих случаях сервер должен возвращать код 401
.
Но мне нужно дифференцировать тогда в моих запросах ajax.
У кого-нибудь есть подсказка, чтобы решить эту проблему?
Примечание. Я не хочу использовать код 403 Forbidden
, потому что в 403 "Authorization will not help"
, согласно RFC.
Ответы
Ответ 1
Вы должны передать пользовательский заголовок в дополнение к коду состояния для конкретных приложений.
Я считаю, что текущая практика заключается в предисловии пользовательских заголовков с X-
Обновление, август 2012:
Из RFC 3864, опубликованный в комментариях (датированный сентябрем 2004 года):
В некоторых случаях (особенно HTTP [24]) синтаксис заголовка и его использование переопределены для конкретного приложения. [...] В некоторых случаях одно и то же имя поля может быть задано по-разному (по различные документы) для использования с различными протоколами приложений. [...] Нам необходимо приспособить области, относящиеся к конкретным приложениям, в то же время желая признавать и поощрять (при необходимости) общность других областей через несколько приложений.
В более позднем RFC (6648, датированном июнем 2012 года), они специально адресуют заголовки X-
.
Устаревает соглашение "X-" для новых заданных параметров в протоколов приложений, включая новые параметры для установленных протоколы. [...] Не рекомендует против практики частных, локальные, предварительные, экспериментальные или конкретные для реализации параметров, только против использования "X-" и подобных конструкций в имена таких параметров.
Важно отметить, что, хотя X-
отмечен специально, они по-прежнему неявно потворствуют настраиваемым заголовкам как способу передачи информации. Префикс для конкретного приложения (MyApp-
) может быть более уместным, чтобы избежать столкновения с любыми другими заголовками.
См. также: Можно ли использовать заголовок X- в ответе HTTP несколько лет назад.
Ответ 2
Если вы не собираетесь использовать HTTP-аутентификацию, правильный ответ равен 403 ( "Запрещено" ).
Код ответа 401 запускает браузер для отображения диалогового окна с паролем, а затем повторно передает тот же запрос с заголовком WWW-Authenticate
с данными пароля, которые пользователь предоставил. Вероятно, это не то поведение, которое вы хотите.
Не слишком зацикливайтесь на объяснениях в RFC - на что вам действительно нужно обратить внимание, это побочные эффекты браузера и поисковых систем различных кодов ответа.
Что касается бита "Authorization will not help"
, в этом случае это правильно, поскольку использование HTTP-авторизации (что конкретно означает заголовок WWW-Authenticate
), на самом деле не поможет.
Ответ 403 сообщает браузеру, что у пользователя нет разрешения на выполнение этого запроса, а браузер должен не пытаться собирать данные аутентификации и повторно отправлять запрос. Это именно тот ответ, который вам нужен.
Ответ 3
Я считаю, что 403 является правильным. Возможно, нам придется настраивать язык в спецификации, чтобы сделать это понятным.
Ответ 4
IIS различает эти случаи с кодами под-состояния (ссылка):
- 401 = Пользователь не вошел в систему, но требуется логин
- 401.1 = Пользователь попытался войти в систему, но их учетные данные недействительны.
- 401.3 = Учетные данные пользователя действительны, но пользователь не имеет права просматривать ресурс.