Ich baue eine AngularJS (1.2.16) Web App mit einer RESTful API, und ich möchte 401 nicht autorisierte Antworten für Anfragen senden, bei denen Authentifizierungsinformationen ungültig oder nicht vorhanden sind. Wenn ich dies tue, sehe ich, selbst wenn ein HTTP-Interceptor vorhanden ist, den browserpräsentierten Basisdialog "Authentication Required", wenn über AngularJS eine AJAX-Anfrage gestellt wird. Mein Interceptor läuft nach dieser Dialog, der zu spät ist, etwas Nützliches zu tun.Verhindern von HTTP Basic Auth Dialog mit AngularJS Interceptors
Ein konkretes Beispiel:
My Back-End-API gibt 401 für /api/things
es sei denn, ein Autorisierungs-Token vorhanden ist. Schön und einfach.
$httpProvider.interceptors.push(['$q', function ($q) {
return {
'responseError': function (rejection) {
if (rejection.status === 401) {
console.log('Got a 401')
}
return $q.reject(rejection)
}
}
}])
Wenn ich meine App laden, entfernen Sie die Authentifizierungs-Token, und führen Sie ein:
Auf der AngularJS App Seite, ich habe einen Abfangjäger wie dies im config
Block am docs und eingerichtet sah AJAX Aufruf /api/things
(um hoffentlich den obigen Interceptor triggern), sehe ich:
Wenn ich das Dialog abzubrechen, ich sehe den Ausgang console.log
„Got a 401“, die ich hatte gehofft, anstelle dieses Dialog zu sehen:
klar, dass die Abfangjäger funktioniert, aber es ist zu spät abfängt!
Ich sehe zahlreiche Postings im Web bezüglich der Authentifizierung mit AngularJS in Situationen wie dieser, und sie alle scheinen HTTP-Interzeptoren zu verwenden, aber keiner von ihnen erwähnt den grundlegenden Auth-Dialog, der auftaucht. Einige falsche Gedanken, die ich für sein Aussehen hatte:
- Fehlende
Content-Type: application/json
Header auf die Antwort? Nein, es ist da. - Müssen Sie etwas anderes als Versprechen Ablehnung zurückgeben? Dieser Code wird immer nach dem Dialog ausgeführt, unabhängig davon, was zurückgegeben wird.
Vermisse ich einen Setup-Schritt oder den Interceptor falsch?
Warum hast du 403 statt 401 nicht benutzt? –
Ich habe eine 401 verwendet, weil ich in der ursprünglichen Frage das Authentifizierungstoken entfernt habe (in meinem Fall ein Cookie). 401 ist der richtige Antwortcode, der hier verwendet werden soll, da die Anforderung Authentifizierung erfordert und keine bereitgestellt wurde. 403 ist für die Authentifizierung vorgesehen, aber der Server verweigert den Zugriff auf die Ressource. –