12

Una domanda simile è pubblicato qui: What's an appropriate HTTP status code to return by a REST API service for a validation failure?Qual è il codice di stato HTTP appropriato da restituire se un utente tenta di accedere con un nome utente/password errati, ma il formato corretto?

La risposta nel thread afferma sopra che "Per esempio, se l'URI si suppone di avere una data di ISO-8601 e si scopre che è nel formato sbagliato o si riferisce a febbraio 31st, quindi restituiresti un HTTP 400. Idem se ti aspetti un XML ben formato in un corpo di entità e non riesci ad analizzarlo. "

Tuttavia, cosa succede se l'utente ha inviato dati formattati correttamente? Con questo voglio dire, l'utente ha inviato una semplice stringa/testo alfabetico per il nome utente e la password (che è perfettamente valida per la mia applicazione). L'unico problema è che la password non corrisponde al nome utente. In questo caso, 400 sarà errato perché è perfettamente sintassi valida e ben formata.

Un 401 sarebbe errato (come suggerito qui: Which HTTP status code to say username or password were incorrect?) perché l'utente non sta provando ad accedere ad alcuna pagina, sta semplicemente cercando di accedere e ha inserito dati che non corrispondono.

Se si guarda indietro al primo post a cui mi sono collegato, la seconda risposta indica che 422 è la risposta corretta (e sembra corretto per me), tuttavia, sto usando Django Rest Framework e 422 non fa parte del codici di stato (un elenco dei codici di stato che fanno parte di DRF può essere trovato qui: http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx)

404 inoltre non sembra corretto perché i dati sono accettati con successo e non rifiutati.

Detto questo, qual è la vera risposta corretta che dovrebbe essere utilizzata?

risposta

14

Il codice HTTP corretto sarebbe in realtà 401. Da the RFC:

La (non autorizzata) codice di stato 401 indica che la richiesta non è stata applicata perché manca delle credenziali di autenticazione valide per la risorsa di destinazione. Il server che genera una risposta 401 DEVE inviare un campo di intestazione Autenticazione WWW (Sezione 4.1) contenente almeno una sfida applicabile alla risorsa di destinazione.

Se la richiesta includeva le credenziali di autenticazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali. Il programma utente PU MAY ripetere la richiesta con un campo di intestazione Autorizzazione nuovo o sostituito (Sezione 4.2).

+0

oh hai ragione, 401 è quello che dovrei usare. Wow, non posso credere di aver perso la seconda parte della spiegazione. Grazie. Segnerò questa domanda come corretta in 8 minuti quando me lo consente. – user2719875

+2

Gli standard sono dannati, penso che 418 sia ancora la migliore risposta – sjagr

+0

Dalla stessa parte che stai citando, una risposta 401 indica che la richiesta non è stata applicata **. Pertanto, nessun tentativo di accesso ** è stato effettuato, poiché l'autorizzazione è necessaria prima a un livello inferiore. Questo può accadere di solito quando sono nidificati diversi livelli di sicurezza ed è una risposta valida per indicare il requisito di autorizzare con un livello esterno prima di tentare di eseguire l'autenticazione con un livello interno. – spectras

Problemi correlati