2017-06-16 55 views
3

我一直在摸索我的腦袋,關於如何解決看起來很簡單的任務大約2天,但它開始讓我瘋狂。使用Node.js和SPA進行SAML2.0身份驗證

我有一個應用程序,用戶將使用SAML 2.0進行身份驗證。 我爲前端設置了一個反應應用程序,並認爲我將使用JWT來確保前端和後端之間的其餘api通信。

當,流程的用戶標誌如下:

  1. 用戶訪問www.server.com/和被送達該靜態HTML反應的應用程序
  2. 用戶點擊「登錄」和訪問www.server.com/login
  3. passport-saml將用戶重定向到saml身份提供商。用戶登錄
  4. 用戶使用req.body中的SamlResponse調用回www.server.com/callback,該密碼由passport-saml解碼並放入req.user。
  5. 如果用戶不存在,我在數據庫中創建用戶。
  6. 我創建了一個智威湯遜。

接下來應該做什麼?問題在於,當從身份提供者回調時,用戶並沒有處於反應應用程序中,所以我已經在應用程序中失去了所有狀態,所以我回復的任何內容都會發送到瀏覽器。

有沒有什麼辦法可以強制瀏覽器給我身份提供者回叫的SamlResponse?然後我可以將它作爲來自react-application的http請求發送到服務器。

回答

3

經過一番思考,我想出了以下解決方案,對我來說工作得非常好。

SAML有一些東西叫RelayState這是服務提供商必須迴應的屬性。所以,現在的過程是這樣的:

  1. 用戶訪問http://frontendserver.com並得到服務器與應用做出反應的靜態頁面(在沒有簽署)。
  2. 用戶單擊'登錄'並被重定向到http://backendserver.com/login/?RelayState=http://frontendserver.com,通過passport-saml進行身份驗證並將用戶重定向到SP。所以我在RelayState中傳遞請求的來源。
  3. 用戶使用SamlResponse調用回http://backendserver.com/callback,其中包括RelayState。
  4. 我創建一個令牌,並將用戶重定向到RelayState/#token
  5. 然後,我可以解析React應用程序中的URL,並將該標記添加爲任何其他請求的標頭。

這看起來似乎是很明顯的做法,但我花了相當長的一段時間才弄清楚這會起作用。

相關問題