Sto costruendo un'app web AngularJS (1.2.16) con un'API RESTful e desidero inviare 401 risposte non autorizzate per le richieste in cui le informazioni di autenticazione non sono valide o non sono presenti. Quando lo faccio, anche con un intercettore HTTP presente, vedo la finestra di dialogo "Autenticazione richiesta" di base del browser quando una richiesta AJAX viene effettuata tramite AngularJS. Il mio intercettore corre dopo il in quella finestra di dialogo, che è troppo tardi per fare qualcosa di utile.Prevenire la finestra di dialogo di autenticazione HTTP utilizzando AngularJS Interceptors
Un esempio concreto:
mio backend API restituisce 401 per /api/things
a meno che un token di autorizzazione è presente. Bello e semplice
Sul lato app AngularJS, ho guardato il docs e impostare un intercettore come questo nel config
blocco:
$httpProvider.interceptors.push(['$q', function ($q) {
return {
'responseError': function (rejection) {
if (rejection.status === 401) {
console.log('Got a 401')
}
return $q.reject(rejection)
}
}
}])
Quando carico la mia app, rimuovere il token di autenticazione, ed eseguire un AJAX chiamata a /api/things
(si spera innescare l'intercettore sopra), vedo questo:
Se cancello che finestra, vedo il console.log
uscita "Ha ottenuto un 401" che speravo di vedere invece di quel dialogo:
Chiaramente, l'intercettore sta lavorando, ma è intercettare troppo tardi!
Vedo numerosi messaggi sul Web relativi all'autenticazione con AngularJS in situazioni come questa, e tutti sembrano utilizzare intercettori HTTP, ma nessuno di loro menziona la finestra di dialogo di autenticazione di base. Alcuni pensieri errati che ho avuto per la sua comparsa inclusi:
- Manca l'intestazione
Content-Type: application/json
sulla risposta? No, è lì. - È necessario restituire qualcosa di diverso dalla promessa di rifiuto? Questo codice viene sempre eseguito dopo la finestra di dialogo, indipendentemente da ciò che viene restituito.
Mi manca qualche passaggio di configurazione o uso l'intercettore in modo errato?
Perché non hai usato 403 anziché 401? –
Ho usato un 401 perché, nella domanda originale, ho rimosso il token di autenticazione (nel mio caso, un cookie). 401 è il codice di risposta corretto da utilizzare qui perché la richiesta richiede l'autenticazione e nessuno è stato fornito. 403 è per quando viene fornita l'autenticazione ma il server nega l'accesso alla risorsa. –