Какой HTTP статус использовать?

Имеем некое RESTful API.

Клиент проходит аутентификацию и получает токен.
Далее для доступа к определённым страницам клиент должен предоставить этот токен.

Какой HTTP статус должен вернуть сервер если токен не передан?
— 400 Bad Request (так как токен является обязательным параметром)
— 401 Unauthorized
— 403 Forbidden

А если передан неверный токен?

UPD
… или истекла сессия для переданного токена?

UPD 2
Согласно "Диаграмме принятия веб-сервером решений на основе заголовков" из википедии, происходит следующее:


Можно ли расценивать отсутствие параметра как «Bad Request»?
The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
RFC 2616 пункт 10.4.1

Если да, то при отсутствии токена код 400 является наиболее верным, т.к. его обработка происходит раньше проверки авторизации.

Далее сервер проверяет авторизован ли клиент.
Если токен неверен или отсутствует (допустим мы решили код 400 не использовать), то сервер отдаёт код 401 — просит пройти авторизацию.

Наконец, сервер узнал пользователя. Есть доступ — работаем дальше, нет доступа — 403 статус.

Кроме того в RFC 2616 сказано о статусе 403:
The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.


Другими словами:
400 или 401 если токен не передан
401 если токен неверен / истекла сессия
403 токен передан и клиент узнан, но не имеет доступа к контенту

Прав ли я?
  • Вопрос задан
  • 5033 просмотра
Пригласить эксперта
Ответы на вопрос 6
karazyabko
@karazyabko
403 для обеих ситуаций, если идет разграничение прав, если просто проверка идентификации — 401
Ответ написан
barker
@barker
А это принципиально или просто хочется сделать как можно более «правильно»?)
Я бы выбрал 403 и для если не передан и для неверного. Если действительно параметр требуемый на уровне API, то для отсутствующего можно и 400, но это спорный вопрос. А 401 всё же для другого задуман.
Ответ написан
karenishe
@karenishe
Я бы посмотрел на это с точки зрения разработчика, который подключается к API: чтобы быстрее и проще продебажить свою ошибку, мне больше всего помог бы статус 401 Unauthorized.
Ответ написан
gnomeby
@gnomeby
Python-программист в Wargaming
Для запроса аунтификации:
* 400 если токен вообще не был передан
* 401 если неверный

Для остальных страниц:
* 403 если токен вообще не был передан
* 403 если неверный
Ответ написан
dustalov
@dustalov
401 — не передан, 403 — некорректен.
Ответ написан
miraage
@miraage
Старый прогер
Неправильный токен — доступ закрыт.

HTTP/1.1 403 Forbidden?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы