2014-11-01 192 views
1

在過去的幾天裏,我一直在苦苦掙扎,並沒有在網絡上找到可靠的,可以理解的解決方案。使用Token保護REST API

我有一個網絡應用程序,它由一個rest api和一個表示層組成。表示層有一個登錄表單,用戶引入的數據被髮送到REST api,然後使用第三方服務來認證用戶。這部分我已經設置好了。

我現在想要的是爲每個後續請求提供基於令牌的身份驗證,因此我不必在每個請求上發送憑據,然後再次對第三方服務進行身份驗證。因此,基本上,使用Spring Security(v 3.1.3),我失去了如何創建一個可靠的安全令牌,將其返回給請求者,然後根據所述令牌驗證請求。

你能指點我正確的方向嗎?或者在線例子?

  • 如何生成令牌?如何將令牌返回給客戶端 ?
  • 如何在隨後的請求中發送令牌?
  • 你如何設置整個事情,所以你第一次可以 以某種方式發送憑證(用戶/通行證),然後 請求只發送令牌?
  • 您如何對令牌進行身份驗證?
  • 我已經看到了令牌包含一些expiryTime的實現。那麼expiryTime之後有什麼用處呢?用戶必須再次登錄,即使他一直在提出請求?我應該在「幕後」更新令牌嗎?
+1

您需要一個oAuth實現。我回答了一個類似的問題[這裏](http://stackoverflow.com/a/26438123/1331801)。 – Jangid 2014-11-01 12:29:21

+0

我相信oAuth可能有點矯枉過正。我已經在網上閱讀了關於更簡單的基於令牌的認證,並且我正在考慮這個問題,然後才沉浸在地獄之中。無論如何,如果你有任何好的輔導oAuth也可能有幫助。 – MichelReap 2014-11-01 14:40:17

+0

如果您對每個請求都執行完整的oAuth工作流程,那麼這將會過度。通常您只需設置一次,並使用訪問令牌發送所有請求。如果需要刷新標記。閱讀[本RFC](http://tools.ietf.org/html/rfc6749#section-1.4)。 – Jangid 2014-11-02 07:30:53

回答

1

服務器端REST應用程序是有狀態的還是無狀態的?如果有狀態的話,您不需要使用常規的HTTP會話做任何特殊的事情。剛開始使用Spring Security時,如果客戶端和服務器已經在交換會話信息,那麼您的受保護的API端點就可以開箱即用。唯一需要注意的是,如果您啓用了CSRF保護,那麼您需要稍微調整一下客戶端。詳細信息見Spring Security文檔。另一方面,如果REST應用程序是無狀態的,那麼您將不得不使用基於標記的方法,就像您所建議的那樣。詳情請見my answer to a similar post。如果您確實選擇遵循該答案中的步驟,那麼您的問題的答案是:

  • 令牌必須在服務器端生成。如果通過鏈接到我的答案的示例代碼,您將看到我已經用基於緩存的基礎結構替換了Spring Security的默認HTTP會話相關基礎結構。在基於會話的實現中,唯一的會話標識符(它是會話標識符)由servlet容器生成,而在自定義實現中,將在應用程序內生成標識符(即標記)。具體而言,我使用SecureRandom實例來生成強壯的令牌。
  • 令牌由客戶端作爲HTTP頭返回。這保護了SSL通道上的內容。
  • 訣竅是從Spring Security實現四個非常簡單的接口。我的示例應用程序有完整的細節整個過程花了不到一個小時。
  • 對令牌的認證由Spring Security自動完成。我們只需提供一個用於存儲和檢索令牌的實現,這是直接的,只需要幾行代碼。
  • 在我的示例應用程序中,我使用了滑動到期的可存放緩存來存儲令牌。如果客戶端定期發送請求,服務器將繼續訪問認證令牌的緩存,從而使令牌在緩存中保持活動狀態。僅在經過一段時間的不活動等於或超過緩存過期期限之後,令牌才從緩存中被驅逐。

因此,總體而言,基於令牌的認證/授權方法可以使用Spring Security輕鬆實現並利用像EHCACHE這樣的緩存庫。