HTTP 401: qual è il valore dell'intestazione WWW-Authenticate appropriato?


109

L'applicazione su cui sto lavorando al momento ha un valore di timeout della sessione. Se l'utente non ha interagito per un periodo più lungo di questo valore, nella pagina successiva che tenterà di caricare verrà richiesto di eseguire il login.

Tutte le richieste effettuate vengono instradate attraverso questo meccanismo, che include le chiamate AJAX. Inizialmente stavamo inviando un'intestazione 200 con la pagina di accesso, che introduce alcuni problemi con AJAX poiché il codice viene eseguito se viene inviata una risposta 200 e la maggior parte dei dati restituiti da queste chiamate RPC è JSON o JavaScript grezzo che viene valutato (non chiedi: |).

Ho suggerito che un 401 è migliore, dal momento che il nostro parser JSON non proverà a consumare una pagina di accesso HTML .. :)

Durante la lettura della specifica , però, ho notato che anche il WWW-Authenticatecampo va inviato.

Qual è un buon valore per questo campo? Sarà Application Loginsufficiente?

Risposte:


67

Quando si indica l'autenticazione di base HTTP, restituiamo qualcosa del tipo:

WWW-Authenticate: Basic realm="myRealm"

Considerando che Basicè lo schema e il resto dipende molto da quello schema. In questo caso, realm fornisce al browser un valore letterale che può essere visualizzato all'utente quando richiede l'ID utente e la password.

Ovviamente non stai utilizzando Basic, tuttavia, poiché non ha senso avere la scadenza della sessione quando viene utilizzata l'autenticazione di base. Presumo che tu stia utilizzando una qualche forma di autenticazione basata su moduli.

Dal ricordo, Windows Challenge Response utilizza uno schema diverso e argomenti diversi.

Il trucco è che sta al browser determinare quali schemi supporta e come risponde ad essi.

La mia sensazione istintiva se stai utilizzando l'autenticazione basata su moduli è di rimanere con la pagina di accesso superiore a 200 ma aggiungere un'intestazione personalizzata che il browser ignorerà ma il tuo AJAX può identificare.

Per un'esperienza utente + AJAX davvero buona, fai in modo che lo script si aggrappi alla richiesta AJAX che ha rilevato che la sessione è scaduta, attiva una richiesta di nuovo accesso tramite un popup e, in caso di successo, invia nuovamente la richiesta AJAX originale e procedi normalmente.

Evita il trucco che fa in modo che lo script raggiunga il sito ogni 5 minuti per mantenere attiva la sessione perché sconfigge il punto di scadenza della sessione.

L'altra alternativa è masterizzare la richiesta AJAX, ma questa è un'esperienza utente scadente.


2
Grazie amico, ora sto usando un 403 invece poiché non è un reindirizzamento e include letteralmente il modulo di accesso al posto della pagina originale. Inoltre corrisponde meglio alla specifica W3. Grazie comunque per l'informazione.
Will Morgan il

2
Vedere questa risposta su come è possibile ancora utilizzare HTTP 401: stackoverflow.com/questions/928874/...
lanoxx

Sì, metti qualcosa nell'intestazione WWW-Authenticate, suppongo. Un'altra risposta in una vena simile è stackoverflow.com/a/1088127/689161 O semplicemente violare le specifiche e non preoccuparti di inviare l'intestazione (almeno alcuni siti lo fanno); 401 è ancora più appropriato di 403.
gengkev

Non sono sicuro che "metterei qualcosa" nell'intestazione WWW-Authenticate perché non posso essere sicuro che la richiesta sia gestita dal mio ajax o dal browser. Oltre al titolo di questa domanda, dato il dettaglio che suggerisce l'autenticazione basata su moduli, non invierei alcuna intestazione WWW-Authenticate. Questo perché non chiedo al browser di partecipare alla procedura di verifica dell'autenticazione / credenziali. Voglio solo che mostri un modulo che sembra essere un modulo di accesso, ma con qualcosa che l'ajax può usare per identificarlo è un modulo di accesso in modo che possa gestirlo in modo diverso come sopra.
Swanny

Dovresti creare uno schema authn da usare con l'intestazione. Quindi il browser non verrà coinvolto perché non capirà lo schema. Alcuni clienti si arrabbiano o si confondono se non includi l'intestazione.
KayEss


-7

Quando la sessione utente scade, rispedisco un codice di stato HTTP 204. Notare che lo stato HTTP 204 non contiene contenuto. Sul lato client faccio questo:

xhr.send(null);
if (xhr.status == 204) 
    Reload();
else 
    dropdown.innerHTML = xhr.responseText;

Ecco la funzione Reload ():

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.