目录

SpringBoot实战三十五微服务集成OAuth2.0UAA

SpringBoot实战(三十五)微服务集成OAuth2.0(UAA)

https://i-blog.csdnimg.cn/direct/65a48c0c3e9a4e319327d1660b5498a6.jpeg

一、知识回顾

在进行微服务集成前,我们先来回顾一下 OAuth2.0 的基础知识。

1.1 什么是 OAuth2 协议?

OAuth2(Open Authorization 2.0) 协议是 ,是一种 用于授权的开放标准协议 ,用于通过第三方应用程序访问用户在某个服务提供商上存储的资源,而无需共享用户的凭证(例如用户名和密码)。

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。…资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。

OAuth2.0 的运行流程如下图所示:

https://i-blog.csdnimg.cn/direct/f30e8850e0d6437f9c8eaf614a3f1e2a.jpeg

(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介绍

  • 官方文档:

2.1 概述

UAA(User Account and Authentication) 是 Cloud Foundry 提供的一个用户账户和认证服务, 主要用于管理用户的身份验证和授权 。UAA 支持多种认证机制,包括 Oauth2.0、OpenID Connect 等,能够为应用程序提供安全的用户管理和访问控制功能。UAA 的 核心功能是为用户提供统一的身份验证服务 ,并确保只有经过授权的用户才能访问特定的资源。

2.2 UAA的主要功能

UAA 的主要功能如下:

  1. 用户管理 :UAA 允许管理员创建、管理和删除用户账户。用户可以通过用户名和密码进行登录,也可以通过其他身份提供者(如 LDAP、SAML 等)进行身份验证。
  2. OAuth2.0支持 :UAA 实现了 OAuth2 协议,允许应用程序通过 OAuth2 进行授权和认证。OAuth2 是一种广泛使用的授权框架,允许用户授权第三方应用访问其资源,而无需共享其凭据。
  3. OpenID Connect支持 :UAA 还支持 OpenID Connect,这是一种基于 OAuth2 的身份验证协议,允许应用程序验证用户的身份并获取用户的基本信息。
  4. 多租户支持 :UAA 支持多租户架构,允许不同的组织或团队在同一 UAA 实例中管理各自的用户和权限。
  5. LDAP 集成 :UAA 可以与 LDAP(轻量级目录访问协议)集成,允许企业使用现有的 LDAP 目录服务进行用户认证。通过 LDAP 集成,UAA 可以从 LDAP 服务器中获取用户信息,并将其映射到 UAA 中的用户角色和权限。

2.3 UAA 的应用场景

UAA 广泛应用于需要用户认证和授权的场景,特别是在微服务架构中。通过 UAA,开发者可以轻松地为多个微服务提供统一的身份验证和授权机制,而不需要每个服务都实现自己的认证逻辑。

Spring Cloud Data Flow 中,UAA 被用于保护数据流和任务的管理接口。通过 UAA,管理员可以控制哪些用户可以创建、部署和管理数据流和任务。UAA 还可以与 LDAP 集成,使得企业可以使用现有的 LDAP 目录服务来管理用户权限。


三、微服务集成

代码地址:

3.1 集成示例介绍

在示例项目中,包含两个核心服务:

  1. demo-eureka: 注册中心;
  2. demo-gateway: 网关中心;
  3. auth-server: 鉴权服务 – 相当于 “授权服务器”;
  4. **user-center: **用户服务 – 相当于 “资源服务器”。

包含五个基础启动包:

  1. common-spring-boot-starter: 基础公共包;

  2. jdbc-spring-boot-starter: JDBC数据库连接工具包;

  3. redis-spring-boot-starter: Redis缓存连接工具包;

  4. uaa-client-spring-boot-starter:

    “资源服务器” 工具包 ;

  5. uaa-server-spring-boot-starter:

    “授权服务器” 工具包 。

整体项目目录结构如下:

https://i-blog.csdnimg.cn/direct/80965cb238964442a90a0aa2bd375467.png

“资源服务器” 工具包 uaa-client-spring-boot-starter 目录结构如下:

https://i-blog.csdnimg.cn/direct/51494b6e651045a08a6814fc0827c0c1.png

注意: 为了实现分布式鉴权,这里我们将token存到了redis缓存中。

“授权服务器” 工具包 uaa-server-spring-boot-starter 目录结构如下:

https://i-blog.csdnimg.cn/direct/39e522979a0a44e79cb3c3963531cd3a.png

3.2 集成测试

1)启动本地redis和数据库,确保 mydb.sql 中的数据已被初始化。

2)启动所有服务,如下所示:

https://i-blog.csdnimg.cn/direct/96af452c7d3c4458847be69ab40e48de.png

3)在 user-center 服务中,有测试接口: /user/list ,如下所示:

https://i-blog.csdnimg.cn/direct/242313895ad44fe088ac8932f97c6b2c.png

我们直接使用 Postman 请求这个接口,如下所示:

https://i-blog.csdnimg.cn/direct/f568b6a4080c47ebba139698b0beb632.png

可以看到,HTTP返回状态码为 401 ,返回内容中提示 unauthorized ,没有权限,说明拦截成功。

4)在 auth-server 服务中,OAuth 2.0 默认的获取授权接口为: /oauth/token ,如下所示:

https://i-blog.csdnimg.cn/direct/0a7750368daf48ecb77e74f05cf8fc08.png

我们输入相应的入参进行请求 token,这里我们以密码模式为例。如下所示:

  • 请求地址: http://localhost:8081/oauth/token?grant_type=password&username=ACGkaka&password=123456&client_id=app&client_secret=app

https://i-blog.csdnimg.cn/direct/1a7db5a15f6f4f59ac5724120607688d.png

这里我们成功获取到了 token。

5)将 token 作为鉴权请求头,再次请求 user-center 中的接口,如下所示:

https://i-blog.csdnimg.cn/direct/dfea069d503d4f5ea46c85eca9fc86f4.png

可以看到,原本被拦截的接口已经可以正常访问了,HTTP状态码也正常返回200了。

代码地址:

整理完毕,完结撒花~🌻