你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程 - 使用 Azure Spring Apps 中的 Spring Cloud 网关对客户端进行身份验证
注意
基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用。
本文适用于:✅ 标准消耗和专用计划(预览版)
本快速入门介绍如何确保在客户端应用与托管在 Azure Spring Apps 之上并受到 Spring Cloud 网关保护的微服务应用程序之间进行安全通信。 客户端应用程序被验证为安全主体,以使用借助 Spring Cloud 网关构建的应用发起与托管在 Azure Spring Apps 上的微服务。 此方法部署 Spring Cloud 网关的令牌中继和 Spring Security 的资源服务器功能用于执行身份验证和授权流程,此方法通过执行 OAuth 2.0 客户端凭据流实现。
下表列出了示例项目的构成:
- 书籍 SPA:此单页应用程序 (SPA) 托管在本地,可与书籍微服务进行交互来添加或搜索书籍。
- 书籍微服务:
- 一款托管在 Azure Spring Apps 中的 Spring Cloud 网关应用程序。 此应用充当书籍 RESTful API 的网关。
- 一款托管在 Azure Spring Apps 中的 Spring Boot REST API 应用程序。 此应用可将书籍信息存储在 H2 数据库中。 此书籍服务将两个 REST 终结点公开以读写书籍。
1.先决条件
- Azure 订阅。 如果你没有订阅,请在开始之前创建一个免费帐户。
- Git。
- Java 开发工具包 (JDK),版本 17。
- 一个 Microsoft Entra 租户。 请参阅快速入门:在 Azure AD 中创建新租户,详细了解如何创建 Microsoft Entra ID 租户。
- Azure CLI 2.45.0 或更高版本。
- 安装 Node.js。
2. 准备 Spring 项目
使用以下步骤在本地克隆和运行应用:
使用以下命令从 GitHub 克隆示例项目:
git clone https://github.com/Azure-Samples/azure-spring-apps-sso-client-credential.git -b consumption-plan
使用以下命令构建书籍后端服务:
cd azure-spring-apps-sso-client-credential ./mvnw clean package
输入 SPA 项目目录,然后使用以下命令安装依赖项:
npm install @azure/msal-node
3. 准备云环境
运行此示例所需的主要资源是 Azure Spring Apps 实例和 Azure Database for PostgreSQL 实例。 本部分提供创建这些资源的步骤。
3.1. 登录到 Azure 门户
打开 Web 浏览器,并转到 Azure 门户。 输入登录到 Microsoft Azure 门户所需的凭据。 默认视图是服务仪表板。
3.2. 创建 Azure Spring Apps 实例
遵循以下步骤来创建服务实例:
在 Azure 门户一角选择“创建资源”。
选择“计算>Azure Spring Apps”。
填写基本表单,其中包含以下信息:
设置 建议值 描述 订阅 订阅名称 要用于服务器的 Azure 订阅。 如果你有多个订阅,请选择要计费的资源所在的订阅。 资源组 myresourcegroup 新的资源组名称,或订阅中的现有资源组。 名称 myasa 用于标识 Azure Spring Apps 服务的唯一名称。 该名称必须为 4 到 32 个字符,只能包含小写字母、数字及连字符。 服务名称的第一个字符必须是字母,最后一个字符必须是字母或数字。 计划 标准消耗和专用型(预览版) 定价层会确定与实例关联的资源和成本。 区域 离用户最近的区域 最靠近用户的位置。 容器应用环境 myacaenv 选择哪个 Azure 容器应用环境实例与其他服务和资源共享同一个虚拟网络。 使用下表作为创建 Azure 容器应用环境的指南:
设置 建议值 说明 环境名称 myacaenv 用于识别 Azure 容器应用环境服务的唯一名称。 计划 消耗 定价层会确定与实例关联的资源和成本。 区域冗余 已禁用 是否在 Azure 可用性区域中创建容器应用环境服务。 重要
消耗工作负荷配置文件有一个没有初始成本的即用即付计费模型。 系统会根据预配的资源对专用工作负荷配置文件收费。 有关详细信息,请参阅 Azure 容器应用(预览版)的“消耗 + 专用”计划结构环境中的工作负荷配置文件和 Azure Spring Apps 定价。
选择“查看 + 创建”,查看所选内容。 选择“创建”来预配 Azure Spring Apps 实例。
在工具栏上选择“通知”图标(铃铛)以监视部署过程。 完成部署后,可以选择“固定到仪表板”,以便在 Azure 门户仪表板上为此服务创建磁贴作为前往此服务的“概述”页的快捷方式。 选择“转到资源”以打开服务的“概述”页。
使用以下命令启用 Eureka 服务器。 请务必将占位符替换为你在上一步中创建的值。
az spring eureka-server enable \ --resource-group <resource-group-name> \ --name <Azure-Spring-Apps-instance-name>
3.3. 注册书籍应用程序
本部分提供注册应用程序以在 Microsoft Entra ID 中添加应用角色的步骤,该 ID 用于保护 Azure Spring Apps 中的 RESTful API。
转到 Microsoft Azure 门户主页。
如果有权访问多个租户,请使用“目录 + 订阅”筛选器 (),选择要在其中注册应用程序的租户。
搜索并选择 Microsoft Entra ID。
在“管理”下,选择“应用注册”>“新建注册” 。
在“名称”字段中输入应用程序的名称,例如“书籍”。 应用的用户可能会看到此名称,你稍后可对其进行更改。
对于“支持的帐户类型”设置,请选择“仅限此组织目录中的帐户”。
选择“注册”以创建应用程序。
在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要该值来为此项目配置 YAML 配置文件。
在“管理”下,选择“公开 API”,在页面开头找到“应用程序 ID URI”,然后选择“添加”。
在“编辑应用程序 ID URI”页面上,接受建议的应用程序 ID URI (
api://{client ID}
) 或使用客户端 ID 之外有含义的名称(例如api://books
),然后选择“保存”。在“管理”下,选择“应用程序角色”>“创建应用程序角色”,然后输入以下信息:
- 对于“显示名称”,请输入“写入”。
- 对于“允许的成员类型”,请选择“应用程序”。
- 对于“值”,请输入“Books.Write”。
- 对于“说明”,请输入“添加书籍”。
重复上一步,添加另一个应用程序角色:
Books.Read
。
3.4. 注册 SPA 应用程序
书籍 RESTful API 应用充当资源服务器,该服务器受 Microsoft Entra ID 保护。 在获取访问令牌之前,需要在 Microsoft Entra ID 中注册另一个应用程序,并向名为“SPA
”的客户端应用程序授予权限。
返回 Microsoft Entra ID 中的租户。
在“管理”下,选择“应用注册”>“新建注册” 。
在“名称”字段中输入应用程序的名称,例如“
SPA
”。对于“支持的帐户类型”,请使用默认的“仅限此组织目录中的帐户”。
选择“注册”以创建应用程序。
在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要它来获取访问令牌。
依次选择“API 权限”“添加权限”“我的组织使用的 API”。 选择先前注册的“
Books
”应用程序,选择权限“Books.Read”和“Books.Write”,然后选择“添加权限”。选择“为 <your-tenant-name> 授予管理员同意”,为你添加的权限授予管理员同意。
导航到“证书和机密”,然后选择“新建客户端密码”。
在“添加客户端密码”页面上,为机密输入一段说明,选择过期日期,然后选择“添加”。
查找机密的“值”,然后将其记录下来以备以后使用。 需要该值来获取访问令牌。
3.5. 更新书籍服务应用的配置
找到 books-service
应用的 books-service/src/main/resources/application.yml 文件。 更新 spring.cloud.azure.active-directory
部分中的配置以匹配以下示例。 请务必将占位符替换为之前创建的值。
spring:
cloud:
azure:
active-directory:
credential:
client-id: <your-application-ID-of-Books>
app-id-uri: <your-application-ID-URI-of-Books>
使用以下命令重新生成示例项目:
./mvnw clean package
4. 将应用部署到 Azure Spring Apps
以下步骤展示如何将应用部署到 Azure。
4.1. 将微服务应用部署到 Azure Spring Apps
按照以下步骤使用适用于 Azure Spring Apps 的 Maven 插件,将应用部署到 Azure Spring Apps:
导航到示例项目目录,然后使用以下命令在 Azure Spring Apps 中配置应用:
./mvnw com.microsoft.azure:azure-spring-apps-maven-plugin:1.18.0:config
以下列表描述了命令交互:
- 选择要配置的子模块(输入以逗号分隔的数字,例如:[1-2,4,6],按 ENTER 可全选):按 Enter 以全选。
- OAuth2 登录:根据 OAuth2 协议授权登录到 Azure。
- 选择订阅:选择所创建的 Azure Spring Apps 实例的订阅列表编号,它默认为列表中的第一个订阅。 如果使用默认编号,请直接按 Enter。
- 选择要部署的 Azure Spring Apps:选择所创建的 Azure Spring Apps 实例的列表编号。 如果使用默认编号,请直接按 Enter。
- 选择要公开公共访问权限的应用:(以逗号分隔的输入数字,例如 [1-2,4,6],按 Enter 可全选):输入“1”表示
gateway-service
。 - 确认保存上述所有配置(是/否):输入“是”。 如果输入“否”,则配置不会保存到 POM 文件中。
使用以下命令部署应用:
./mvnw azure-spring-apps:deploy
以下列表描述了命令交互:
- OAuth2 登录:你需要根据 OAuth2 协议授权到 Azure 的登录。
执行命令后,可以看到如下日志消息,表示部署成功。
[INFO] Getting public url of app(gateway-service)... [INFO] Application url: https://gateway-service.xxxxxxxxxxxxxx-xxxxxxxx.eastasia.azurecontainerapps.io ... [INFO] Artifact(books-service-0.0.1-SNAPSHOT.jar) is uploaded and deployment(default) is successfully updated. ...
输出的应用程序 URL 是用于访问 ToDo RESTful API 应用程序的基础终结点。
4.2。 在本地运行 SPA 应用
更新 SPA
应用程序脚本文件 spa/server.js 中的配置,以匹配以下示例。 请务必将占位符替换为你在上一步中创建的值。
const SpringCloudGatewayURL = "<URL exposed by app gateway-service>"
const msalConfig = {
auth: {
clientId: "< SPA App Registration ClientId>",
authority: "https://login.microsoftonline.com/< TenantId >/",
clientSecret: "<SPA App Registration ClientSecret>",
},
};
const tokenRequest = {
scopes: ["<Application ID URI of Books>/.default"]
};
在 SPA 项目目录中,使用以下命令在本地运行:
node server.js
注意
SPA 应用是一种静态 Web 应用程序,可以部署到任何 Web 服务器。
5. 验证应用
可以访问通过 gateway-service
应用与 Books RESTful API 进行通信的 Books SPA 应用。
在浏览器中转到
http://localhost:3000
以访问此应用程序。输入“作者”和“标题”的值,然后选择“添加书籍”。 你会看到类似于以下示例的响应:
Book added successfully: {"id":1,"author":"Jeff Black","title":"Spring In Action"}
6.清理资源
可以删除 Azure 资源组,其中包括资源组中的所有资源。 按照以下步骤删除整个资源组(包括新创建的服务器):
在 Azure 门户中查找资源组。
选择“资源组”,然后选择资源组的名称,例如 myresourcegroup。
在资源组页上,选择“删除”。 在文本框中输入资源组的名称来确认删除。
选择“删除”。
7. 后续步骤
有关详细信息,请参阅以下文章: