Когда на 401 против когда на 302

Я работаю над веб-сайтом на основе Rails REST и пишу свои функциональные тесты для контроллеров. В качестве приложения на основе REST я использую несколько глаголов HTTP, GET, POST, PUT, DELETE и т. д.

Я заметил, что я непоследовательно использую коды ответов HTTP 401 и 302 в отношении анонимных пользователей. Иногда, когда они делают запрос на ресурс, требующий аутентификации, я возвращаю 401 Unauthorized. В других случаях я возвращаю 302 и перенаправляю их на страницу входа.

Есть ли стандарт, которому я должен следовать здесь? Когда следует использовать 401? Когда я должен перенаправить на страницу входа? Например,

  • Следует ли перенаправить GETs?
  • Должен ли POSTs получить 401?
  • Что мне делать для запросов AJAX, где 302 не будет выполняться?

Или, возможно, это всего лишь вопрос мнения, соглашение, которое мне нужно выбрать и соблюдать самостоятельно.


person Jeff    schedule 08.04.2014    source источник


Ответы (2)


Когда я прочитал RFC, пользователи, не прошедшие проверку подлинности, запрашивающие ресурс, требующий проверки подлинности, должны постоянно получать 401 Unauthorized. Из РФЦ:

302 Found: запрошенный ресурс временно находится под другим URI.

401 Unauthorized: Запрос требует аутентификации пользователя.

Очевидно, что 302 неправильно описывает вашу ситуацию, а 401 делает.

person Eric Stein    schedule 08.04.2014
comment
да. Строго говоря, это правильно. Однако это непрактично. Я уверен, что большинство людей в SO знают, что веб-сайты часто перенаправляют пользователей на страницу входа в систему, когда они пытаются получить доступ к защищенному ресурсу. Это именно то, что я хочу сделать со своим сайтом. Просто сказать «Нет, не авторизован» — неподходящая для меня ситуация. Я также не хочу, чтобы поисковые системы сканировали весь мой сайт и видели формы входа на каждый URL-адрес. - person Jeff; 08.04.2014
comment
Я не уверен, почему вы задаете вопрос, если вы уже определились с ответом. В любом случае, делать что-то постоянно намного лучше, чем возвращать 401 в одних ситуациях и 302 в других. - person Eric Stein; 08.04.2014
comment
Я не определился с ответом. Похоже, вы устанавливаете какие-то связи, которых у меня нет. Вот почему я задал вопрос. - person Jeff; 08.04.2014
comment
Я только что отредактировал вопрос. Возможно, обновление прояснит, где я ищу помощи. - person Jeff; 08.04.2014
comment
Перенаправление AJAX по проблеме 302 — вот почему вы должны постоянно использовать 401. Если я правильно понимаю ваш вопрос, вы хотите вернуть 302 иногда и 401 раз. Это хуже, чем всегда возвращать 302 — клиентам приходится писать логику обработки ошибок, которая обрабатывает разные типы запросов по-разному, и они должны помнить, какой выбор вы сделали, вместо того, чтобы следовать установленному соглашению. Если вы хотите перенаправление, встройте его на стороне клиента, когда запрос возвращается с ошибкой 401. Вы использовали тег REST, поэтому я дал ответ REST. Вы можете, конечно, делать все, что хотите! - person Eric Stein; 08.04.2014
comment
Хорошая точка зрения. Думаю, я не ищу чистую точку зрения REST. Думаю, мне нужно сделать шаг назад и, возможно, немного изменить дизайн. - person Jeff; 08.04.2014
comment
Это только что получил значок популярного вопроса, поэтому я подумал, что могу вернуться и сообщить вам, что вы продали меня на этом. Нет 302с. Делайте ошибки 401 правильно и дайте клиенту понять, что делать. ОТДЫХ есть ОТДЫХ. Не шутите с этим. - person Jeff; 01.09.2020

Я не знаю, будут ли поисковые системы индексировать страницу 401.

В идеале для страницы с ограниченным доступом для пользователей, не прошедших проверку подлинности: код состояния 401 и покажите форму входа.

Для аутентифицированных пользователей, которые все еще не допущены: 403 и неавторизованная страница.

Для страницы входа: 200 OK и показать форму входа.

person Frank Forte    schedule 12.04.2021