OAuth2微服務的安全性

OAuth2微服務的安全性


前言

公開由許多微服務組成的公共訪問API時要考慮的最重要方面之一是安全性。Spring具有一些有趣的功能和框架,使我們的微服務安全性配置更加容易。在本文中,我將向您展示如何使用Spring Cloud和Oauth2在API網關後面提供令牌訪問安全性。

理論

目前,所有主要網站都使用OAuth2標準,允許您通過共享API訪問其資源。它是一種開放授權標準,允許用戶將存儲在一個頁面中的私有資源共享到另一頁面,而不必使用其憑據服務。這些是與oauth2相關的基本術語。

· 資源所有者 –處理對資源的訪問

· 資源服務器 –存儲所有者資源的服務器,可以使用特殊令牌共享這些資源

· 授權服務器

–管理密鑰,令牌和其他臨時資源訪問代碼的分配。它還必須確保授予相關人員訪問權限

· 訪問令牌 –允許訪問資源的密鑰

· 授權授予 –授予訪問權限。有多種確認訪問的方法:授權碼,隱式,資源所有者密碼憑證和客戶端憑證

該協議的流程包括三個主要步驟。首先,我們將授權請求發送到資源所有者。在資源所有者的響應之後,我們將授權授予請求發送到授權服務器並接收訪問令牌。最後,我們將此訪問令牌發送到Resource Server,如果有效,則API將資源提供給應用程序。

我們的解決方案

下圖顯示了示例的體系結構。我們有API網關(Zuul),用於將我們的請求代理到授權服務器和兩個帳戶微服務實例。授權服務器是提供outh2安全機制的某種基礎結構服務。我們還擁有發現服務(Eureka),在其中註冊了我們所有的微服務。

OAuth2微服務的安全性

網關

對於我們的示例,我們不會在API網關上提供任何安全性。它只需要代理從客戶端到授權服務器和autService的請求。在下面可見的Zuul網關配置中,我們將emptyHeader屬性設置為空值以啟用Authorization HTTP標頭轉發。默認情況下,Zuul在將我們的請求轉發到目標API時會剪切該標頭,其實這是不正確的,因為網關後面我們的服務需要基本授權。

zuul:

routes:

uaa:

path: /uaa/**

sensitiveHeaders:

serviceId: auth-server

account:

path: /account/**

sensitiveHeaders:

serviceId: account-service

網關內部的主類源代碼非常簡單。它只需要啟用Zuul代理功能和發現客戶端即可從Eureka註冊表收集服務。

@SpringBootApplication

@EnableZuulProxy

@EnableDiscoveryClient

public class GatewayServer {

public static void main(String[] args) {

SpringApplication.run(GatewayServer.class, args);

}

}

授權服務器

我們的授權服務器儘可能簡單。它基於默認的Spring安全配置。客戶端授權詳細信息存儲在內存中的存儲庫中。當然,在生產模式下,您想使用其他實現而不是諸如JDBC數據源和令牌存儲之類的內存中存儲庫。這是來自application.yml的配置片段。 client-id和 client-secret 提供了用戶基本的身份驗證數據和基本的安全憑證。用戶憑證通常是Spring Security用戶詳細信息。

security:

user:

name: root

password: password

oauth2:

client:

client-id: acme

client-secret: secret

@EnableAuthorizationServer是帶有的認證服務器的主要類 。我們還公開了一個REST端點,其中包含用於帳戶服務的用戶身份驗證詳細信息,併為客戶端啟用了Eureka註冊和發現。

@SpringBootApplication

@EnableAuthorizationServer

@EnableDiscoveryClient

@EnableResourceServer

@RestController

public class AuthServer {

public static void main(String[] args) {

SpringApplication.run(AuthServer.class, args);

}

@RequestMapping("/user")

public Principal user(Principal user) {

return user;

}

}

應用程序–帳戶微服務

我們的示例微服務僅對@GET請求提供一個端點,該端點始終返回同一帳戶。在主類中,啟用了資源服務器和Eureka發現。服務配置很簡單。


測試中

我們只需要Web瀏覽器和REST客戶端(例如Chrome Advanced REST客戶端)即可測試我們的解決方案。讓我們從向資源所有者發送授權請求開始。我們可以通過Web瀏覽器中的Zuul網關調用oauth2授權端點。


發送此請求後,我們應該看到下面的頁面。選擇批准,然後單擊授權以從授權服務器請求訪問令牌。如果應用程序身份經過驗證且授權授予有效,則應在HTTP響應中返回對該應用程序的訪問令牌。

OAuth2微服務的安全性

b1acaa35-1ebd-4995-987d-56ee1c0619e5&token_type = bearer&state = 48532&expires_in = 43199

最後一步是使用訪問令牌聯繫帳戶端點。我們必須將其作為承載令牌放入Authorization標頭中。在示例應用程序中,安全操作的日誌記錄級別設置為TRACE,因此您可以輕鬆找出發生問題的情況。

OAuth2微服務的安全性

結論

老實說,我對應用程序中的安全性問題不是很熟悉。在Spring Security中,我們幾乎提供了所有需要的機制。它還提供了可以輕鬆擴展以滿足更高級要求的組件。


分享到:


相關文章: