2016-08-09 178 views
1

In meiner eckigen App versuche ich grundlegende HTTP-Authentifizierung durchzuführen.eckige HTTP-Authentifizierung: keine Browser-Login-Eingabeaufforderung erhalten

Ich sende die http Get-Anfrage von Angular ohne irgendwelche Anmeldeinformationen zunächst, da ich davon ausgehe, dass, wenn das Backend einen 401-Status sendet, der Browser mich nach Anmeldeinformationen fragen würde und dann die Anforderung selbst erneut einreichen würde.

Die Aufforderung zur Eingabe des Browsers wird jedoch nie angezeigt. Diese ist der Fehler, die ich bekomme:

angular.js:11756 GET http://localhost:8080/appName/rest/keys/Keys?batch=0&userName=Test 401 (Unauthorized) 

Dies sind die Header i für die Antwort erhalten:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:origin, content-type, accept, authorization 
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS, HEAD 
Access-Control-Allow-Origin:http://localhost:3001/ 
Content-Length:0 
Date:Tue, 09 Aug 2016 14:53:26 GMT 
Server:Apache-Coyote/1.1 
WWW-Authenticate:Basic 

Ich hatte gehofft, dass der Browser Prompt würde automatisch angezeigt, wenn es Status trifft 401, aber es scheint hier nicht der Fall zu sein. Fehle ich etwas?

EDIT:

Es funktioniert nicht in Chrome und Firefox, funktioniert aber in IE, IE eine Anmeldeaufforderung angezeigt wird, wenn ich versuche, die URL für den Zugriff auf und funktioniert einwandfrei mit Benutzername und Passwort, während Chrome direkt gibt einen 401 Fehler.

Wenn ich versuche, direkt über die Adressleiste auf die Server-URL zuzugreifen, zeigt Chrome die Anmeldeaufforderung an und fragt nach den Anmeldeinformationen. Nicht sicher, aber kann es ein CORS-Problem sein?

+0

Interessanterweise funktioniert es in IE, nicht in Chrom. IE zeigt die Eingabeaufforderung wie üblich an. – gaurav5430

Antwort

1

Ok, ich konnte das Problem lösen.

Das Problem war in der Tat mit CORS verwandt, nicht direkt. Es war auch am IE arbeiten, da IE CORS nicht respektiert und sowieso Zugriff auf Cross-Herkunft haben wird.

Zwei Dinge fehlten:

Zunächst schickte ich (zusammen mit anderen Header) Access-Control-Allow-Origin : * vom Server für CORS ermöglicht. Dann bekam ich wissen:

Firefox und Chrome erfordern eine genaue Domain-Angabe in Access-Control-Allow-Origin-Header. Für Server mit Authentifizierung, , erlauben diese Browser kein "*" in dieser Kopfzeile. Der Header Access-Control-Allow-Origin muss den Wert Origin Header enthalten, der vom Client übergeben wurde.

https://www.webdavsystem.com/ajax/programming/cross_origin_requests/

Und dann gibt es ein Problem im Zusammenhang mit Ursprung Browser Auth zu überqueren:

standardmäßig in Cross-Site-XMLHttpRequest Anrufungen, wird Browser keine Anmeldeinformationen senden. Ein bestimmtes Flag muss für das XMLHttpRequest-Objekt festgelegt werden, wenn es aufgerufen wird.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

Diese spezifische Flag ist withCredentials : true, die mit dem XHR Anfrage eingestellt werden muss.Ich schaffte es, es mit meiner http-Anfrage von der eckigen App einzustellen, und voila, es hat funktioniert!