Раздел 5.2 RFC 6749 (http://tools.ietf.org/html/rfc6749#section-5.2) описывает реакцию на ошибку. В нем говорится, что сервер должен ответить HTTP 400 (неверный запрос). Но вместо этого oauthlib использует HTTP 401 (Unauthorized) для таких ошибок, как InvalidClientError
, InvalidGrantError
, UnauthorizedClientError
и других связанных ошибок.
Например https://github.com/idan/oauthlib/blob/master/oauthlib/oauth2/rfc6749/errors.py#L181
В спецификации упоминается, что 401 может использоваться с недопустимыми ошибками клиента и должен использоваться, когда аутентификация была выполнена через поле заголовка авторизации. Хотя в настоящее время oauthlib ничего не делает, чтобы предположить, что поле заголовка «WWW-Authenticate» должно быть включено в ответ, как того требует спецификация. Я считаю, что оставить 401 для этой ошибки нормально, но мы должны добавить предложение заголовка к исключению.
Что касается другого, в спецификации прямо не говорится, что может использоваться 401, и поэтому нам, вероятно, следует подумать о переходе на 400. Однако это кажется более подходящим с 401 как в случае недопустимого гранта, так и особенно в случае ошибок неавторизованного клиента.
@asteinlein , @lepture , @masci мысли?
@ib-lundgren Привет - только что наткнулся на эту самую проблему и хотел бы присоединиться. Прочитав спецификацию и просмотрев другие ответы, IMO 400 - правильный ответ.
Во-первых, спецификация:
Сервер авторизации отвечает HTTP 400 (неверный запрос).
код состояния (если не указано иное) и включает в себя следующие
параметры с ответом:
В требованиях 400 нет ДОЛЖЕН, но нет и МОЖЕТ.
Во-вторых, и причина, по которой я наткнулся на это, заключалась в ошибке своего рода на солнце JDK на моем клиенте (см. здесь: http://stackoverflow.com/a/7524681/1137254)
По сути, HTTP-стек моего клиента рано закроет соединение из-за ошибки 401, но приведенный выше стек OAuth (google-http-oauth-client) попытается продолжить чтение и анализ результатов. Я думаю, что это было написано в OpenJDK в соответствии с определением и ожиданиями вокруг 401 (ОБНОВЛЕНИЕ: на самом деле это связано с «потоковым» режимом). IMO OpenJDK тоже ошибается, и я думаю, что столкнулся бы с той же проблемой, если бы получил «invalid_client» 401 во время запросов конечной точки /token.
Добавление еще одного голоса за 400 является правильным кодом ошибки здесь. Раньше мы использовали django-oauth2-provider для аутентификации oauth2 из мобильных приложений, и в этом случае он возвращал 400. При переходе на django-oauth-toolkit (который использует oauthlib) для обновления до более новых версий Django нам пришлось взломать представление запроса токена, чтобы вместо этого возвращалось 400, чтобы мобильные приложения работали правильно.
Вот один из авторов спецификации, в котором конкретно указано, что 400 является предполагаемым ответом для недействительных учетных данных аутентификации при запросе токена и почему: https://www.ietf.org/mail-archive/web/oauth/current/msg02127 .html
И вот еще один пример проекта, который не справляется с oauthlib, используя 401 в этих обстоятельствах.
+1 за 400
Голосуй за 400
Я возрождаю эту старую тему и начинаю PR с изменениями, предложенными выше.
Прежде чем продвигаться вперед, я хотел бы подвести итоги обсуждения, которое произошло в прошлом.
WWW-Authenticate
, а это не всегда возможно во всех ответах об ошибках.401
в oauthlib должны быть 400
. Однако у нас есть два случая с 401
:invalid_client
, где ДОЛЖНО быть 401
, если используется HTTP-аутентификация, иначе МОЖЕТ быть 401
.invalid_token
, где ДОЛЖНО быть 401
.В любом случае, если используется 401
, ДОЛЖЕН быть установлен WWW-Authenticate
( RFC2616 ).
Краткий обзор наиболее распространенных реализаций OAuth2.0 похож на общий консенсус:
400
so-question / so-question .400
salesforce-forum .401
с WWW-Authenticate
azur-docs .400
aws-cognito-docs . Они нарушили « ДОЛЖЕН » RFC, чтобы он составлял 401
при использовании HTTP-аутентификации.Мы должны соответствовать RFC, однако, чтобы не нарушать реализацию, мы не должны включать эти изменения в версию 2.xx, а должны дождаться версии 3.xx.
Пожалуйста, не стесняйтесь вмешиваться.
Я не могу вспомнить причину/клиента(ов), которые заставили меня отправить PR #247, но я вижу и понимаю причины для отмены этого. Спасибо за потрясающее исследование @JonathanHuot , и сделать это в 3.x звучит как лучший подход.
Исправлено в #561/oauthlib>= 3.0.0
в соответствии с этим RFC, упомянутым выше, недопустимый клиент также должен возвращать статус 400, но в пакете все еще есть 401.
Привет @esfandiaryfard , не могли бы вы указать точный текст RFC? Спасибо!
Самый полезный комментарий
Прежде чем продвигаться вперед, я хотел бы подвести итоги обсуждения, которое произошло в прошлом.
WWW-Authenticate
, а это не всегда возможно во всех ответах об ошибках.401
в oauthlib должны быть400
. Однако у нас есть два случая с401
:invalid_client
, где ДОЛЖНО быть401
, если используется HTTP-аутентификация, иначе МОЖЕТ быть401
.invalid_token
, где ДОЛЖНО быть401
.В любом случае, если используется
401
, ДОЛЖЕН быть установленWWW-Authenticate
( RFC2616 ).Другие реализации OAuth2.0
Краткий обзор наиболее распространенных реализаций OAuth2.0 похож на общий консенсус:
400
so-question / so-question .400
salesforce-forum .401
сWWW-Authenticate
azur-docs .400
aws-cognito-docs . Они нарушили « ДОЛЖЕН » RFC, чтобы он составлял401
при использовании HTTP-аутентификации.Заключение
Мы должны соответствовать RFC, однако, чтобы не нарушать реализацию, мы не должны включать эти изменения в версию 2.xx, а должны дождаться версии 3.xx.
Пожалуйста, не стесняйтесь вмешиваться.