2017-02-18 96 views
6

在我的應用程序(Angular 2/Ionic 2)我實現了我自己的登錄/認證。基本上它是這樣工作的:在登錄時,用戶名和密碼正在由PHP後端驗證。生成一個令牌,然後將其發送回頭部的前端(授權)。來自後端的響應如下所示:Angular 2:獲取授權標題

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 

顯然存在具有令牌存在的授權標頭。 因爲我在Allow-Headers標頭中看到了授權,CORS似乎也被正確設置。

但是,當我試圖讓頭部在角2,它總是返回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 || { }; 
} 

方法的第一行還給假的。此外,當我檢查頭在我的響應對象,它顯示我只有以下(Chrome瀏覽器開發工具):

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

有出現在該對象中沒有授權頭。

任何人都可以幫我嗎?

感謝提前:)

+0

'Authorization'通常用作請求標頭,而不是r esponse。你爲什麼不在響應的主體中返回訪問令牌? –

+0

因爲據我所知,這是'Authorization'頭的用途。在每個請求(當用戶登錄時),我在請求中發送Authorization標頭,檢查標記是否仍然有效,然後爲了更安全,重新生成標記,並將其發回到前端,授權標題。 我錯過了什麼嗎? – dave0688

+3

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

回答

15

只是想後的答案,因爲它可能會幫助別人: 的解決方案設置

Access-Control-Expose-Headers: Authorization 

然後 - 前端可以讀取Authorization頭爲好。

+1

你在哪裏添加了這個? – MrNew

+0

您必須將其添加到您的後端。 – VWeber

+0

Tks,這對我很有用。 –

2

這個答案讓我:link

它顯示瞭如何將它添加在後端,以及如何在前端使用

Java後端:

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

和訪問上的角頭像這樣:

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

歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下很有用:[添加鏈接的上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解它是什麼以及爲什麼它在那裏,然後引用您鏈接的頁面中最相關的部分,以防目標頁面不可用。 [只是一個鏈接的答案可能會被刪除。](// stackoverflow.com/help/deleted-answers) – Rob

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供該鏈接供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18132740) –