目录
- 一、知识回顾
- 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
整理完毕,完结撒花~🌻