2011-03-03 77 views
1

我正在通過Spring MVC中的Web服務開發API。用戶必須進行身份驗證,並在客戶端瀏覽器中設置cookie。現在這個API不會在同一個域中,所以我需要一種方法來知道客戶端上的會話何時超時,因爲他們在登錄後會發出API請求。什麼是最安全的方法?在會話,緩存,數據庫中存儲信息以與服務器上的請求cookie進行比較?API用戶會話Spring

回答

3

在我的情況下,我爲已成功驗證的用戶生成唯一的身份驗證令牌。每次用戶需要調用任何Web服務時,都需要傳遞身份驗證令牌。

產生我的身份驗證令牌,這樣的事情: -

Date creationDate = new Date(); 
String key = UUID.randomUUID().toString().toUpperCase() + "|" + userName + "|" + creationDate.getTime(); 
String authenticationToken = ... // encrypt key with Jasypt 

我附加了創建日期,因爲它可以讓我覈對的時間生存。每次用戶調用任何Web服務時,我都會使用創建日期檢查空閒時間。如果空閒時間少於30分鐘,我將空閒時間重置爲零,並允許用戶執行Web服務。但是,如果用戶閒置超過30分鐘,我認爲身份驗證令牌無效,並且必須重新進行身份驗證才能獲取新令牌。

+0

不錯的主意。這是否安全,不受任何劫持?也許將IP存儲在密鑰中,並在服務器端檢查它?我甚至需要將任何東西存儲在數據庫中?在我給你支票之前,我會等待更多的答案。 – 2011-03-03 20:33:19

+0

你當然可以附加IP或任何有用的信息,使您的密鑰更獨特。這將允許您執行更強大的檢查以確保用戶是合適的用戶。在我的情況下,我必須將空閒時間存儲在數據庫中,因爲我正在集羣環境中運行,所以將這樣的數據存儲爲「靜態映射」並不適用。這是一個非常簡單的數據庫表,它包含身份驗證令牌,用戶名,創建日期,上次訪問日期和總訪問權限(用於審覈目的)。 – limc 2011-03-03 20:38:17

+0

我對前段時間寫的api使用過類似的方法。這很容易實現,我非常喜歡這個原則。事實上,如果通過網絡發送清楚,它是脆弱的,但風險受限於令牌的有效期,如果它太明智,則應在客戶端和服務器之間使用HTTPS。 – dSebastien 2011-03-03 21:08:22