Подтвердить что ты не робот

Какой HTTP-код использовать в случаях "Не аутентифицирован" и "Не разрешен"?

Я читал, что "401 Unauthorized" код должен использоваться, когда пользователь:

  • Не регистрируется, но требуется логин ( "не аутентифицирован" );
  • Записано, но его профиль не позволяет увидеть этот URL ( "не авторизован" );

Согласно RFC, в обоих случаях сервер должен возвращать код 401. Но мне нужно дифференцировать тогда в моих запросах ajax.

У кого-нибудь есть подсказка, чтобы решить эту проблему?

Примечание. Я не хочу использовать код 403 Forbidden, потому что в 403 "Authorization will not help", согласно RFC.

4b9b3361

Ответ 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 = Учетные данные пользователя действительны, но пользователь не имеет права просматривать ресурс.