序言
安全性是暴露由許多微服務組成的公共訪問API時要考慮的最重要的一個方面。Spring有一些有趣的功能和框架,使我們的微服務安全配置更容易。在本文中,我將向您展示如何使用Spring Cloud和Oauth2在API網關后面提供令牌訪問安全性。
理論知識
OAuth2標準目前被所有主要網站使用并且允許通過共享API訪問其資源。它是一種開放式授權標準,允許用戶將存儲在一個頁面中的私有資源共享到另一個頁面,而無需進入其憑據服務。這些是與oauth2相關的基本術語。
- Resource Owner – 處理對資源的訪問
- Resource Server – 存儲可以使用特殊令牌共享的所有者資源的服務器
- Authorization Server – 管理密鑰,令牌和其他臨時資源訪問代碼的分配。它還必須確保授予相關人員訪問權限
- Access Token – 允許訪問資源的密鑰
- Authorization Grant – 授予訪問權限。有多種方法可以確認訪問權限:授權代碼,隱式,資源所有者密碼憑據和客戶端憑據
您可以在此處以及在digitalocean文章中閱讀有關此標準的更多信息。該協議的流程主要有三個步驟。首先,我們將授權請求發送給資源所有者。在資源所有者響應后,我們向授權服務器發送授權請求并接收訪問令牌。最后,我們將此訪問令牌發送到資源服務器,如果它有效,則API將資源提供給應用程序。
方案
下圖顯示了我們案例的架構。我們用API網關(Zuul)代理我們對授權服務器的請求和兩個帳戶微服務實例。授權服務器是某種提供outh2安全機制的基礎結構服務。我們還有發現服務(Eureka),我們所有的微服務都已注冊。
網關
對于我們的示例,我們不會在API網關上提供任何安全性。它只需要將客戶端的請求代理到授權服務器和帳戶微服務。在下面可見的Zuul的網關配置中,我們將sensitiveHeaders屬性設為空值以啟用授權HTTP頭轉發。默認情況下,Zuul在將我們的請求轉發到目標API時切斷了該頭,這是不正確的,因為網關后面的服務需要基本授權。
網關源代碼中的主類非常簡單。它只需要啟用Zuul代理功能和發現客戶端來收集Eureka注冊表中的服務。
授權服務器
gaOur授權服務器內的主類也很簡單。它基于默認的Spring安全配置。客戶端授權詳細信息存儲在內存存儲庫中。當然在生產模式中,您也可以使用其他實現而不是內存存儲庫,如JDBC數據源和令牌存儲。您可以在Spring Security Reference和Spring Boot Security中閱讀有關Spring授權機制的更多信息。這是Application.yml的配置片段。我們為/ token端點提供了用戶基本身份驗證數據和基本安全憑證:client-id和client-secret。用戶憑據是普通的Spring Security用戶詳細信息。
這是用@EnableAuthorizationServer實現身份驗證服務器的主要類。我們公開一個REST端點驗證帳戶服務的用戶身份詳情,并為客戶端啟用了Eureka注冊和發現。
Application-賬戶微服務
我們的示例微服務只有一個@GET請求的端點,它始終返回相同的帳戶。在主類中,資源服務和Eureka發現都已啟用。服務配置很簡單。 GitHub上提供了示例應用程序源代碼。
測試
我們只需要Web瀏覽器和REST客戶端(例如Chrome Advanced REST客戶端)來測試我們的解決方案。從向資源所有者發送授權請求開始測試。我們可以通過Web瀏覽器中的Zuul網關調用oauth2授權端點。
http://localhost:8765/uaa/oauth/authorize?response_type=token&client_id=acme&redirect_uri=http://example.com&scope=openid&state=48532
發送請求后,我們應該看到下面的頁面。選擇“Approve”,然后單擊“Authorize”,從授權服務器請求訪問令牌。如果應用程序標識已通過身份驗證且授權授予有效,則應在HTTP響應中返回應用程序的訪問標記。
http://example.com/#access_token=b1acaa35-1ebd-4995-987d-56ee1c0619e5&token_type=bearer&state=48532&expires_in=43199
最后一步是使用訪問令牌調用帳戶端點。我們不得不將其作為承載令牌放入Authorization標頭中。在示例應用程序中,安全操作的日志記錄級別設置為TRACE,因此您可以輕松找出問題發生時的情況。
結束語
說實話,我不太熟悉應用程序中的安全問題。所以對我來說一個非常重要的是使用的安全解決方案的簡單性。在Spring Security中,我們幾乎所有需要的機制都是開箱即用的。它還提供可輕松擴展的組件,以滿足更高級的要求。您應該將本文視為使用Spring Cloud和Spring Security項目的更高級解決方案的簡要介紹。
原文鏈接:https://piotrminkowski.wordPress/ target=_blank class=infotextkey>WordPress.com/2017/02/22/microservices-security-with-oauth2/
作者:Piotr Mińkowski
譯者:Emma