12

Podobna kwestia jest zamieszczona tutaj: What's an appropriate HTTP status code to return by a REST API service for a validation failure?Jaki jest prawidłowy kod stanu HTTP, który zostanie zwrócony, jeśli użytkownik spróbuje zalogować się przy użyciu nieprawidłowej nazwy użytkownika/hasła, ale prawidłowy format?

Odpowiedź w wątku powyżej stwierdza, że ​​„Na przykład, jeśli URI ma mieć datę ISO-8601 i okaże się, że jest w niewłaściwym formacie lub odnosi się do lutego 31-szy, wtedy zwrócisz HTTP 400. Ditto, jeśli spodziewasz się dobrze sformułowanego XML-a w ciele jednostki i nie uda się parsować. "

Co się stanie, jeśli użytkownik przesłał poprawnie sformatowane dane? Rozumiem przez to, że użytkownik przesłał zwykły alfabetyczny ciąg/tekst dla nazwy użytkownika i hasła (co jest całkowicie poprawne dla mojej aplikacji). Jedynym problemem jest to, że hasło nie pasuje do nazwy użytkownika. W tym przypadku 400 będzie niepoprawne, ponieważ jest to całkowicie poprawna składnia i dobrze sformułowane.

401 byłby niepoprawny (jak sugerowano tutaj: Which HTTP status code to say username or password were incorrect?), ponieważ użytkownik nie próbuje uzyskać dostępu do żadnej strony, po prostu próbuje się zalogować i wprowadził dane, które nie pasują.

Jeśli spojrzysz wstecz na pierwszy wpis, do którego się przyłączyłem, druga odpowiedź stwierdza, że ​​422 to poprawna odpowiedź (i wygląda na to, że jest poprawna), jednak używam Django Rest Framework, a 422 nie jest częścią kody statusu (lista kodów statusu, które są częścią DRF można znaleźć tutaj: http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx)

404 również nie wygląda dobrze, ponieważ dane zostały pomyślnie zaakceptowane i nie zostały odrzucone.

W związku z tym, jaka jest prawdziwa poprawna odpowiedź, która powinna zostać zastosowana?

Odpowiedz

14

Poprawny kod HTTP byłby rzeczywiście 401. Od the RFC:

401 (Nieautoryzowane) kod stanu wskazuje że żądanie nie zostało zastosowane, ponieważ brakuje w nim prawidłowych danych uwierzytelniających dla zasobu docelowego. Serwer generujący odpowiedź 401 MUSI wysłać pole nagłówka Authenticate WWW (sekcja 4.1) zawierające co najmniej jedno wyzwanie dotyczące zasobu docelowego.

Jeśli żądanie zawierało dane uwierzytelniające, odpowiedź 401 wskazuje, że autoryzacja została odrzucona dla tych poświadczeń. Agent użytkownika MOŻE powtórzyć żądanie z nowym lub zastąpionym nagłówkiem Authorization (sekcja 4.2).

+0

o masz rację, 401 jest tym, czego powinienem używać. Wow, nie mogę uwierzyć, że przegapiłem drugą część wyjaśnienia. Dzięki. Zaznaczę to pytanie jako poprawne w 8 minut, kiedy pozwala mi to zrobić. – user2719875

+2

Standardy są przeklęte, myślę, że 418 wciąż jest najlepszą odpowiedzią. – sjagr

+0

Od części, którą cytujesz, odpowiedź 401 wskazuje, że żądanie ** nie zostało zastosowane **. Dlatego nie podjęto nawet próby ** logowania **, ponieważ autoryzacja jest wymagana najpierw na niższym poziomie. Zdarza się to zazwyczaj, gdy kilka warstw zabezpieczeń jest zagnieżdżonych i jest poprawną odpowiedzią, która wskazuje na wymóg autoryzacji z zewnętrzną warstwą przed próbą autoryzacji z wewnętrzną warstwą. – spectras