Должен ли я вернуть код ответа 401 или 405 пользователю API REST без достаточного доступа?

Я разрабатываю API, который также будет иметь компонент аутентификации/авторизации.

Любой, независимо от статуса проверки подлинности, сможет писать (POST), но в зависимости от того, не аутентифицирован ли он, аутентифицирован как обычный пользователь или аутентифицирован как администратор и какой ресурс вы пытаетесь получить доступ, я собираюсь возвращать разные ответы для GET, DELETE и PUT.

Я пытаюсь выяснить наиболее подходящий код ответа для пользователя, который не прошел проверку подлинности и/или авторизован.

Имейте в виду http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html:

Неавторизованный → 401

Запрещено → 403

Не допускается метод → 405

Используйте конкретные примеры:

  • Джон Доу не проверен, на DELETE он должен получить 401 или 405?
  • Эми проверена, но не авторизована, на DELETE она должна получить 403 или 405?

(Имейте в виду, что даже если Джон и Эми запрещены или несанкционированы, это не значит, что они не могут получить доступ к одному и тому же ресурсу с другим HTTP VERB.)

Спасибо.

Ответ 1

405 Method Not Allowed следует использовать, только если вы не поддерживаете этот метод. Его нельзя использовать, чтобы сообщить клиенту, что они не могут использовать этот метод.

Таким образом, единственным хорошим HTTP-кодом в вашем случае будет 401 Unauthorized. Он указывает клиенту, что метод существует, и что им необходимо войти в систему, чтобы получить к нему доступ.

Ответ 2

В этом случае я думаю, что некоторые примеры для пояснения полезны:

  • Неаутентифицированный + Поддерживаемый метод = 401
  • Неаутентифицированный + Неподдерживаемый метод = 405
  • Аутентифицированный + Авторизованный + Поддерживаемый метод = 2xx
  • Аутентифицированный + Авторизованный + Неподдерживаемый метод = 405
  • Аутентифицированный + Неавторизованный + Поддерживаемый метод = 403
  • Аутентифицированный + Неавторизованный + Неподдерживаемый метод = 405

Иными словами, с процедурной точки зрения:

  • Проверьте, поддерживаются ли методы. Если нет: 405
  • Если поддерживается, проверьте, проверен ли пользователь. Если нет: 401
  • Если вы прошли проверку подлинности, проверьте, разрешен ли пользователь. Если нет: 403
  • Если разрешено: 2xx

EDIT: Я наткнулся на эту диаграмму и подумал, что это может быть полезно для всех, кто мог бы наткнуться на этот пост. Нажмите, чтобы увеличить.

введите описание изображения здесь

Оригинал здесь.