2014-08-31 86 views
31

我正試圖設計一個將有多個服務(服務數據)和Web應用程序(服務HTML)的綠色領域項目。我讀過關於微服務的內容,看起來很合適。微服務體系結構中的單點登錄

我還有的問題是如何實現SSO。我希望用戶進行一次認證,並有權訪問所有不同的服務和應用程序。

我能想到的幾種方法:

  1. 添加身份服務和應用。任何具有受保護資源的服務都將與Identity服務通信,以確保其擁有的憑證有效。如果他們不是,它會重定向用戶進行身份驗證。

  2. 使用網絡標準,如OpenID,並讓每個服務處理它自己的身份。這意味着用戶將不得不單獨授權每個服務/應用程序,但在此之後它將成爲SSO。

我很樂意聽到其他想法。如果一個特定的PaaS(比如Heroku)擁有一個專有的解決方案,那也是可以接受的。

+0

因此,通過閱讀本文,我猜測沒有官方的標準方法來解決這類問題? – 2015-04-14 09:41:12

+1

你說得對。我使用自己的OAuth提供商獲得SSO結果,但這不是唯一的方法。 – 2015-04-18 05:15:48

+0

我偶然發現這個線程(和更多的網站)。我發現這兩個網站在這方面非常有用: https://medium.facilelogin.com/securing-microservices-with-oauth-2-0-jwt-and-xacml-d03770a9a838 http:// nordicapis。 com/how-to-control-user-identity-within-microservices/ – Yogi 2017-03-23 14:19:47

回答

23

在我以前的工作中實現微服務架構時,我們決定採用最佳方法與#1一致,添加身份服務並通過它授權服務訪問權限。在我們的例子中,這是用令牌完成的。如果請求帶有授權令牌,那麼我們可以使用身份服務驗證該令牌,如果它是用戶與服務的會話中的第一個呼叫。一旦令牌被驗證,它就被保存在會話中,以便用戶會話中的後續呼叫不必進行額外的呼叫。如果令牌需要在該會話中刷新,您還可以創建預定作業。

在這種情況下,我們使用OAuth 2.0端點進行身份驗證,並將令牌添加到HTTP標頭以調用我們的域。所有的服務都從該域中路由,所以我們可以從HTTP頭獲取令牌。由於我們都是同一應用程序生態系統的一部分,因此最初的OAuth 2.0授權將列出用戶將爲其帳戶授予的應用程序服務。

此方法的一個補充是身份服務將提供代理客戶端庫,它將被添加到HTTP請求過濾器鏈並處理授權過程到服務。該服務將被配置爲使用來自身份服務的代理客戶端庫。由於我們使用的是Dropwizard,該代理將成爲一個Dropwizard模塊,將過濾器引導到正在運行的服務進程中。這允許對身份服務進行更新,只要接口沒有顯着變化,也可以通過相關服務輕鬆使用免費的客戶端更新。

我們的部署架構遍佈AWS Virtual Private Cloud(VPC)和我們自己公司的數據中心。 OAuth 2.0身份驗證服務位於公司的數據中心,而我們的所有應用程序服務均已部署到AWS VPC。

我希望我們採取的方法有助於您的決定。如果您有任何其他問題,請告訴我。

+0

即使我已經結束了相同的情況,但在我的情況下,我有很多微服務,但我不希望用戶獲得宏偉的許可(假設我使用Oauth )的其他微服務明確例如:在電子商務網站,如果用戶在主應用程序中進行身份驗證,我不希望用戶明確授權購物車應用程序,建議應用程序(這應該是最終用戶無縫)是否有任何方法我們可以使用Oauth或SAML實現這一點? – 2015-07-19 14:23:38

+1

「所有服務都從該域路由」的含義是什麼? – wonder 2016-10-17 10:53:02

+0

感謝您的提示;我根據您的提示實施了我的sso。以下是我對您評論中所述方法的解釋視頻:https://www.youtube.com/watch?v = r7FAuAlKIqY&t = 36s – 2017-05-03 00:58:18

27

Chris Sterling解釋了上面的標準認證實踐,這是絕對有道理的。我只是想出於一些實際的原因在這裏再想一想。

我們實施了認證服務和多個其他依賴auth服務器的微服務來授權資源。在某些時候,由於往返認證服務器的次數過多,我們遇到了性能問題,隨着微服務數量的增加,我們對auth服務器也存在可擴展性問題。我們稍微改變了架構以避免過多的往返行程。

Auth服務器將只與證書聯繫一次,它將基於私鑰生成令牌。對應的公鑰將被安裝在每個客戶端(微服務服務器)中,這將能夠驗證身份驗證密鑰與無聯繫身份驗證服務器。密鑰包含生成的時間以及安裝在微服務中的客戶端實用程序也會有效。儘管這不是標準的實現,但是我們對這個模型非常成功,特別是當所有的微服務都在內部託管時。

+1

我認爲你所描述的內容已經由Chris完成了,正如他所說的那樣> *它被保存在會話中,因此用戶會話中的後續呼叫不必進行額外呼叫。*也許我錯了。 – 2015-04-14 09:38:38

+4

由於端點的無狀態性,會話中的保存可能無法擴展或不推薦。在我的方法中,它永遠不會保存任何內容,只需使用公鑰加密來避免auth服務器的往返。 – kamoor 2015-04-15 19:10:56

+0

> *即使它不是標準實現*。你稱之爲標準實現? – 2015-04-16 07:23:10

相關問題