2017-08-24 162 views
1

我有兩個Spring Boot REST應用程序。其中一個應用程序調用Spring RestTemplate。讓我們調用這些應用程序服務器和客戶端應用如何通過RestFemplate傳遞CSRF令牌

服務器應用正在發送XSRF-TOKEN令牌的cookie,這是對UI的部分完成。然而,沒有辦法(我不知道)爲服務器區分來自瀏覽器的請求和來自客戶端應用程序的請求。所以我不能有選擇地將CSRF令牌從服務器發送到瀏覽器。

有一個內置在彈簧機構允許RestTemplate檢測CSRF的Cookie /頭和重放的要求?

如果不是我怎麼能手動做同樣的事情?我是否應該等待發生CSRF異常,然後從響應中讀取cookie並重播它?

如果它做一次,然後它會是好的,但是要等待例外,每RestTemplate調用看起來不正確。

我可能會嘗試存儲令牌一次,從下一次的設置,但如何將它處理多個服務器應用方案(我旁邊來實現)。由於CSRF一個服務器應用程序的令牌對另一個服務器應用程序無效,因此我將無法存儲單個令牌,但我必須存儲令牌映射圖,該映射圖會爲每個新的服務器應用程序URL添加一個條目。

這一切似乎都太複雜了,我寧願讓Spring處理它。

任何線索表示讚賞。

感謝

回答

0

現在我已經實現,而不會在服務器上的應用程序可以調用以獲取CSRF保護餅乾REST服務。我必須始終創建會話,以便CSRF cookie不會在一個會話中更改,因此我可以避免出現錯誤Could not verify the provided CSRF token because your session was not found

客戶端應用程序調用CSRF休息服務來獲取Cookie,然後通過下一次服務調用發送它。

這似乎是一個大部分通過RestTemplate呼籲每個REST調用的CSRF令牌服務但它爲我節省了從執行存儲會話的複雜的邏輯。 CSRF令牌服務只提供cookie,因此與實際服務呼叫相比,網絡呼叫不會花費太多時間。

我也在考慮使用持久性存儲(SQL數據庫或Redis)來存儲服務器應用程序的CSRF令牌,然後讓客戶端應用程序直接從持久存儲中讀取它。

但是我不知道如何將Session + Server app + CSRF token關聯在一起來識別客戶端所需的令牌。由於客戶端最初沒有會話,因此無法從數據庫唯一地找到它的令牌的CSRF令牌。由於RestTemplate未存儲下次調用的會話,因此這種方法更加複雜。