目錄
- 一、知識回顧
- 1.1 什么是 OAuth2 協議?
- 1.2 OAuth2 的4個角色
- 1.3 OAuth2 的3種令牌
- 1.4 OAuth2 的5種認證方式
- 1.5 OAuth2 內置接口地址
- 二、UAA介紹
- 2.1 概述
- 2.2 UAA的主要功能
- 2.3 UAA 的應用場景
- 三、微服務集成
- 3.1 集成示例介紹
- 3.2 集成測試

一、知識回顧
在進行微服務集成前,我們先來回顧一下 OAuth2.0 的基礎知識。
1.1 什么是 OAuth2 協議?
OAuth2(Open Authorization 2.0)
協議是 RFC 6749 文件,是一種 用于授權的開放標準協議,用于通過第三方應用程序訪問用戶在某個服務提供商上存儲的資源,而無需共享用戶的憑證(例如用戶名和密碼)。
OAuth 引入了一個授權層,用來分離兩種不同的角色:客戶端和資源所有者。…資源所有者同意以后,資源服務器可以向客戶端頒發令牌。客戶端通過令牌,去請求數據。
OAuth2.0 的運行流程如下圖所示:
(A)用戶打開客戶端以后,客戶端要求用戶給予授權。
(B)用戶同意給予客戶端授權。
(C)客戶端使用上一步獲得的授權,向認證服務器申請令牌。
(D)認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌。
(E)客戶端使用令牌,向資源服務器申請獲取資源。
(F)資源服務器確認令牌無誤,同意向客戶端開放資源。
簡而言之:你要獲取我(資源服務器)的資源的話,得先找他(授權服務器)授權。
1.2 OAuth2 的4個角色
OAuth2.0 認證過程中,涉及到的四個角色如下 :
客戶端(Client)
:代表資源所有者與授權服務器進行交互的應用程序。可以是Web應用程序、移動應用程序或第三方服務。資源所有者(Resource Owner)
:即用戶或系統的代表,擁有受保護資源的所有權。授權服務器(Authorization Server)
:負責驗證資源所有者的身份并頒發訪問令牌(Access Token)給客戶端。它通常是一個獨立的服務器,可以與資源服務器分離或合并。資源服務器(Resource Server)
:存儲受保護的資源,并根據令牌的有效性進行訪問控制。資源服務器可以是一個或多個服務,可以授權服務器分離或合并。
1.3 OAuth2 的3種令牌
- 授權許可(Authorization Grant):資源所有者授權客戶端訪問受保護資源的憑證,如:授權碼、隱式授權、密碼授權、客戶端憑證等。
- 令牌(Access Token):用于標識授權許可的憑證,包括訪問令牌、刷新令牌和身份令牌等。
- 令牌端點(Token Endpoint):客戶端與授權服務器交互以獲取或刷新令牌的API端點。
1.4 OAuth2 的5種認證方式
OAuth2.0 提供了五種認證方式:
授權類型 | grant_type 值 | 適用場景 | 安全性 |
---|---|---|---|
授權碼模式 | authorization_code | 有后端的 Web 應用 | 高 |
簡化模式 | implicit | 純前端應用(如 SPA) | 中 |
密碼模式 | password | 高度信任的客戶端(如第一方應用) | 低 |
客戶端憑證模式 | client_credentials | 客戶端訪問自己的資源(M2M) | 中 |
刷新令牌模式 | refresh_token | 獲取新的訪問令牌 | 高 |
這里我們舉例的是 授權碼模式
,篇幅有限,沒有集成數據庫。如果需要支持其他模式,需要對 AuthorizationConfig.java
中的內容進行改造。
1.5 OAuth2 內置接口地址
OAuth2.0 內置了6個接口地址,如下所示:
- /oauth/authorize:授權端點(核心)
- /oauth/token:獲取令牌端點(核心)
- /oauth/confirm_access:用戶確認授權提交端點
- /oauth/error:授權服務錯誤信息端點
- /oauth/check_token:用于資源服務訪問的令牌解析端點
- /oauth/token_key:提供公有密匙的端點,如果你使用JWT令牌的話
二、UAA介紹
- 官方文檔: https://docs.spring.io/spring-cloud-dataflow-samples/docs/current/reference/html/_security.html
2.1 概述
UAA(User Account and Authentication)
是 Cloud Foundry 提供的一個用戶賬戶和認證服務,主要用于管理用戶的身份驗證和授權。UAA 支持多種認證機制,包括 Oauth2.0、OpenID Connect 等,能夠為應用程序提供安全的用戶管理和訪問控制功能。UAA 的 核心功能是為用戶提供統一的身份驗證服務,并確保只有經過授權的用戶才能訪問特定的資源。
2.2 UAA的主要功能
UAA 的主要功能如下:
- 用戶管理:UAA 允許管理員創建、管理和刪除用戶賬戶。用戶可以通過用戶名和密碼進行登錄,也可以通過其他身份提供者(如 LDAP、SAML 等)進行身份驗證。
- OAuth2.0支持:UAA 實現了 OAuth2 協議,允許應用程序通過 OAuth2 進行授權和認證。OAuth2 是一種廣泛使用的授權框架,允許用戶授權第三方應用訪問其資源,而無需共享其憑據。
- OpenID Connect支持:UAA 還支持 OpenID Connect,這是一種基于 OAuth2 的身份驗證協議,允許應用程序驗證用戶的身份并獲取用戶的基本信息。
- 多租戶支持:UAA 支持多租戶架構,允許不同的組織或團隊在同一 UAA 實例中管理各自的用戶和權限。
- LDAP 集成:UAA 可以與 LDAP(輕量級目錄訪問協議)集成,允許企業使用現有的 LDAP 目錄服務進行用戶認證。通過 LDAP 集成,UAA 可以從 LDAP 服務器中獲取用戶信息,并將其映射到 UAA 中的用戶角色和權限。
2.3 UAA 的應用場景
UAA 廣泛應用于需要用戶認證和授權的場景,特別是在微服務架構中。通過 UAA,開發者可以輕松地為多個微服務提供統一的身份驗證和授權機制,而不需要每個服務都實現自己的認證邏輯。
在 Spring Cloud Data Flow
中,UAA 被用于保護數據流和任務的管理接口。通過 UAA,管理員可以控制哪些用戶可以創建、部署和管理數據流和任務。UAA 還可以與 LDAP 集成,使得企業可以使用現有的 LDAP 目錄服務來管理用戶權限。
三、微服務集成
代碼地址: https://gitee.com/acgkaka/SpringBootExamples/tree/master/springboot-mybatis-plus-oauth2.0
3.1 集成示例介紹
在示例項目中,包含兩個核心服務:
- demo-eureka: 注冊中心;
- demo-gateway: 網關中心;
- auth-server: 鑒權服務 – 相當于 “授權服務器”;
- **user-center: **用戶服務 – 相當于 “資源服務器”。
包含五個基礎啟動包:
- common-spring-boot-starter: 基礎公共包;
- jdbc-spring-boot-starter: JDBC數據庫連接工具包;
- redis-spring-boot-starter: Redis緩存連接工具包;
- uaa-client-spring-boot-starter: “資源服務器” 工具包;
- uaa-server-spring-boot-starter: “授權服務器” 工具包。
整體項目目錄結構如下:
“資源服務器” 工具包 uaa-client-spring-boot-starter
目錄結構如下:
注意: 為了實現分布式鑒權,這里我們將token存到了redis緩存中。
“授權服務器” 工具包 uaa-server-spring-boot-starter
目錄結構如下:
3.2 集成測試
1)啟動本地redis和數據庫,確保 mydb.sql
中的數據已被初始化。
2)啟動所有服務,如下所示:
3)在 user-center 服務中,有測試接口:/user/list
,如下所示:
我們直接使用 Postman 請求這個接口,如下所示:
可以看到,HTTP返回狀態碼為 401
,返回內容中提示 unauthorized
,沒有權限,說明攔截成功。
4)在 auth-server 服務中,OAuth 2.0 默認的獲取授權接口為:/oauth/token
,如下所示:
我們輸入相應的入參進行請求 token,這里我們以密碼模式為例。如下所示:
- 請求地址: http://localhost:8081/oauth/token?grant_type=password&username=ACGkaka&password=123456&client_id=app&client_secret=app
這里我們成功獲取到了 token。
5)將 token 作為鑒權請求頭,再次請求 user-center 中的接口,如下所示:
可以看到,原本被攔截的接口已經可以正常訪問了,HTTP狀態碼也正常返回200了。
代碼地址: https://gitee.com/acgkaka/SpringBootExamples/tree/master/springboot-mybatis-plus-oauth2.0
整理完畢,完結撒花~🌻