Який код стану HTTP слід повернути, якщо користувач намагається ввійти в систему з неправильним ім’ям користувача / паролем, але правильним форматом?


81

Подібне запитання розміщено тут: Який код стану HTTP підлягає поверненню службою REST API для помилки перевірки?

Відповідь у поточній версії стверджує, що "Наприклад, якщо URI повинен мати дату ISO-8601, і ви виявите, що він має неправильний формат або посилається на 31 лютого, тоді ви повернете HTTP 400. Так само, якщо ви очікуєте добре сформований XML в тілі сутності, і він не може проаналізувати ".

Однак що станеться, якщо користувач подасть правильно відформатовані дані? Під цим я маю на увазі, що користувач подав простий алфавітний рядок / текст для імені користувача та пароля (що цілком справедливо для моєї програми). Проблема лише в тому, що пароль не збігався з ім’ям користувача. У цьому випадку 400 буде неправильним, оскільки це цілком правильний синтаксис і добре сформований.

401 буде неправильним (як пропонується тут: Який код стану HTTP, щоб сказати, що ім’я користувача чи пароль були неправильними? ), Оскільки користувач не намагається отримати доступ до жодної сторінки, він просто намагається увійти в систему та вводить дані, які не збігаються.

Якщо озирнутися до першого допису, до якого я зв’язав, друга відповідь стверджує, що 422 - це правильна відповідь (і це мені здається правильним), однак, я використовую Django Rest Framework і 422 не є частиною кодів стану (a Список кодів статусу, які є частиною DRF, можна знайти тут: http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx )

404 також не виглядає правильно, оскільки дані успішно приймаються та не відмовляються.

З огляду на це, яка справжня правильна відповідь, яку слід використовувати?

Відповіді:


114

Правильним кодом HTTP насправді буде 401. З RFC :

Код стану 401 (неавторизований) вказує на те, що запит не застосовано, оскільки в ньому відсутні дійсні облікові дані автентифікації для цільового ресурсу. Сервер, що генерує відповідь 401, ПОВИНЕН надіслати поле заголовка WWW-Authenticate (Розділ 4.1), що містить принаймні одне завдання, застосовне до цільового ресурсу.

Якщо запит включав автентифікаційні дані, тоді відповідь 401 вказує на те, що в цих авторизаціях відмовлено в авторизації. Агент користувача МОЖЕ повторити запит з новим або заміненим полем заголовка авторизації (Розділ 4.2).


1
о, ти маєш рацію, 401 - це те, що я мав би використовувати. Ого, не віриться, що я пропустив другу частину пояснення. Дякую. Я позначу це питання як правильне через 8 хвилин, коли це дозволить.
user2719875

З тієї самої частини, яку ви цитуєте, відповідь 401 вказує на те, що запит не застосовано . Тому жодної спроби входу навіть не було зроблено, оскільки спочатку потрібна авторизація на нижчому рівні. Зазвичай це може статися, коли вкладено кілька рівнів захисту, і це дійсний відповідь, який вказує вимогу авторизації із зовнішнім шаром перед спробою авторизації з внутрішнім шаром.
спектри

2
@sjagr> насправді, я прокоментував, оскільки мені зв'язали вашу відповідь на мою думку щодо того самого питання, тут: stackoverflow.com/a/32897804/3212865 . Основним моментом є те, що питання змішує різні рівні спілкування, і найбільш ортогональною відповіддю буде насправді 200, тобто "запит було оброблено успішно і зроблена відповідна спроба входу, знайти результат у змісті відповіді" . Спроба висловити помилку на рівні програми в коді стану транспортного рівня є помилкою проектування.
спектри

8
Я вважаю, що ця відповідь неправильна. Вимога до супровідного WWW-Authenticateвипливає, що 401 вимагає аутентифікації за допомогою HTTP Basic або подібного. Для невдалих входів (у типовому сценарії входу на основі файлів cookie) слід використовувати 403, як пояснюється цією відповіддю: webmasters.stackexchange.com/questions/24443/…
callum

2
Здається, це підлягає певному тлумаченню залежно від того, як буквально сприймаються деякі твердження. Я розумію, що в запиті відсутні дійсні облікові дані для автентифікації, а не в тому, що вони взагалі відсутні . Оскільки у другій частині все ще згадується, що запит міг включати облікові дані, перш за все, я вважаю, що статус 401 правильний.
sjagr


-21

Я думаю, що буде добре встановити код стану відповіді 200 . Щоб запобігти атаці на список слів. У величезному масовому кіберзлочинці не могли визначити, який запит та відповіді правильні)))


4
Для цього призначені обмеження тарифів та час очікування / чорний список.
T1960CT

6
Натомість "кіберзлочинець" може проаналізувати тіло відповіді.
діонизиз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.