2017-02-18 10 views
6

in meiner App (Angular 2/Ionic 2) Ich implementierte meine eigene Anmeldung/Authentifizierung. Grundsätzlich funktioniert es so: Beim Anmelden werden Benutzername und Passwort vom PHP-Backend validiert. Es wird ein Token generiert, das an das Frontend im Header zurückgeschickt wird (Authorization). Die Antwort vom Backend sieht wie folgt aus:Angular 2: Erhalten Autorisierung Header

HTTP/1.1 200 OK 
Host: localhost:8080 
Connection: close 
X-Powered-By: PHP/5.6.28 
Set-Cookie: PHPSESSID=jagagi2le1b8i7r90esr4vmeo6; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Type: application/json 
Authorization: d7b24a1643a61706975213306446aa4e4157d167eaad9aac989067a329c492d3 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, Origin, Authorization 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Content-Length: 301 

Es gibt eindeutig eine Autorisierung Header mit einem Token vorhanden. CORS scheint auch richtig eingerichtet zu sein, da ich Autorisierung in der Kopfzeile Zulassen-Header sehe.

Aber, wenn ich versuche, den Header in Angular 2 zu bekommen, gibt es immer null:

private extractDataAndSetAuthHeader(res: Response) { 

    // Set auth header if available. 
    // If not available - user is not logged in. Then 
    // we also have to remove the token from localStorage 
    if(res.headers.has("Authorization")) 
    { 
     let token = res.headers.get("Authorization"); 

     this.setToken(token); 
    } 
    else 
    { 
     // If no token is sent, remove it 
     this.removeToken(); 
    } 

    let body = res.json(); 
    return body.data || { }; 
} 

Die erste Zeile des Verfahrens zurück falsch gibt. Auch wenn ich die Header überprüfen in meiner Antwort Objekt, es zeigt mir nur die folgenden (Chrome Entwickler-Tools):

[[Entries]]: 
Array[4] 
0:{"pragma" => Array[1]} 
1:{"content-type" => Array[1]} 
2:{"cache-control" => Array[1]} 
3:{"expires" => Array[1]} 

Es gibt keine Authorization-Header in das Objekt.

Kann mir bitte jemand helfen?

Vielen Dank im Voraus :)

+0

'Autorisierung' wird normalerweise als Anforderungsheader verwendet, nicht als r Antwort. Warum geben Sie das Zugriffstoken nicht im Hauptteil der Antwort zurück? –

+0

Denn soweit ich weiß, ist das der 'Authorization' Header. Bei jeder Anfrage (wenn der Benutzer angemeldet ist) sende ich einen Authorization Header in der Anfrage, überprüfe, ob das Token noch gültig ist, dann, um sicherer zu sein, erzeuge ich das Token neu und sende es zurück an das Frontend mit einem ' Autorisierungsheader Fehle ich etwas? – dave0688

+3

http://stackoverflow.com/q/42306684/2587435 –

Antwort

15

Ich wollte nur die Antwort auf, sobald es andere helfen könnten: Die Lösung als

Access-Control-Expose-Headers: Authorization 

Dann setzen - Frontend als auch das Autorisierungsheader lesen kann.

+1

wo hast du das hinzugefügt? – MrNew

+0

Sie müssen dies in Ihrem Backend hinzufügen. – VWeber

+0

Tks, das funktioniert für mich. –

2

Diese Antwort hat mir geholfen: link

Es zeigt, wie es im Backend hinzuzufügen, und wie es im Frontend verwendet

Java Backend:

public void methodJava(HttpServletResponse response){ 
... 
response.addHeader("access-control-expose-headers", "Authorization"); 
} 

und Zugriff auf die Header auf Winkel wie folgt:

return this.http 
    .get(<your url here for your backend>) 
    .map(res => console.log("cookie: " + res.headers.get("Authorization")) 
} 
+0

Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: [Fügen Sie einen Kontext um den Link hinzu] (// meta.stackexchange.com/a/8259), damit Ihre Mitbenutzer eine Idee haben, was es ist und warum es dort ist, zitieren Sie dann den relevantesten Teil der Seite, auf den Sie verlinken, falls die Zielseite nicht verfügbar ist. [Antworten, die etwas mehr als ein Link sind, können gelöscht werden.] (// stackoverflow.com/help/deleted-answers) – Rob

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und bereitzustellen der Link als Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18132740) –

Verwandte Themen