To jest pytanie koncepcyjne.
Mam aplikację kliencką (mobilną), która musi obsługiwać akcję logowania do usługi sieciowej RESTful. Ponieważ usługa sieciowa jest zgodna z REST, oznacza to, że klient akceptuje nazwę użytkownika / hasło od użytkownika, weryfikuje tę nazwę użytkownika / hasło w usłudze, a następnie po prostu pamięta o wysyłaniu tej nazwy użytkownika / hasła przy wszystkich kolejnych żądaniach.
Wszystkie inne odpowiedzi w tej usłudze internetowej są dostarczane w formacie JSON.
Pytanie brzmi, kiedy wysyłam zapytanie do usługi sieciowej, aby po prostu dowiedzieć się, czy podana nazwa użytkownika / hasło są prawidłowe, czy usługa sieciowa powinna zawsze odpowiadać danymi JSON informującymi mnie o pomyślnym lub nieudanym wyniku, czy też powinna zwrócić HTTP 200 przy dobrych poświadczeniach i HTTP 401 na złych poświadczeniach.
Powodem, dla którego pytam, jest to, że niektóre inne usługi RESTful używają 401 dla złych poświadczeń, nawet gdy pytasz tylko, czy poświadczenia są prawidłowe. Jednak rozumiem, że odpowiedzi 401 są takie, że reprezentują one zasoby, do których nie powinieneś mieć dostępu bez ważnych poświadczeń. Jednak zasób logowania POWINIEN być dostępny dla każdego, ponieważ jedynym celem zasobu logowania jest poinformowanie Cię, czy Twoje poświadczenia są ważne.
Innymi słowy, wydaje mi się, że taka prośba:
myservice.com/this/is/a/user/action
powinien zwrócić 401, jeśli podano nieprawidłowe poświadczenia. Ale prośba taka jak:
myservice.com/are/these/credentials/valid
nigdy nie powinien zwracać 401, ponieważ ten konkretny adres URL (żądanie) jest autoryzowany z ważnymi poświadczeniami lub bez nich.
Chciałbym usłyszeć kilka uzasadnionych opinii w tej czy innej sprawie. Jaki jest standardowy sposób radzenia sobie z tym i czy standardowy sposób postępowania jest logicznie odpowiedni?
authentication is required and has failed or has not yet been provided
ma to zastosowanie, ponieważ nie pytasz o ważność poświadczeń, ale o określony zasób na podstawie dostarczonych poświadczeń.401 należy wysłać tylko wtedy, gdy żądanie wymaga pola nagłówka autoryzacji i autoryzacja się nie powiedzie. Ponieważ interfejs API logowania nie wymaga autoryzacji, stąd 401 to moim zdaniem zły kod błędu
Zgodnie ze standardem tutaj https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
* 10.4.2 401 Brak autoryzacji
Żądanie wymaga uwierzytelnienia użytkownika. Odpowiedź MUSI zawierać nagłówek WWW-Authenticate (sekcja 14.47) zawierający wezwanie mające zastosowanie do żądanego zasobu. Klient MOŻE powtórzyć żądanie z odpowiednim nagłówkiem Authorization (rozdział 14.8). Jeśli żądanie zawierało już poświadczenia autoryzacji, odpowiedź 401 wskazuje, że odmówiono autoryzacji dla tych poświadczeń. Jeżeli odpowiedź 401 zawiera to samo wezwanie, co poprzednia odpowiedź, a agent użytkownika już co najmniej raz próbował uwierzytelnić, wówczas użytkownikowi POWINIEN zostać przedstawiona jednostka, która została podana w odpowiedzi, ponieważ jednostka ta może zawierać istotne informacje diagnostyczne. Uwierzytelnianie dostępu HTTP jest wyjaśnione w rozdziale „Uwierzytelnianie HTTP: uwierzytelnianie podstawowe i cyfrowe” [43]. *
źródło
Zwróć 409 z odpowiednim komunikatem o błędzie.
źródło