你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:将 RESTful API 应用程序部署到 Azure Spring Apps

注意

从 2025 年 3 月中旬开始,基本、标准和企业计划将弃用,停用期为三年。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

从 2024 年 9 月 30 日开始,标准消耗和专用计划将弃用,六个月后将完全关闭。 建议过渡到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文介绍如何将受 Microsoft Entra ID 保护的 RESTful API 应用程序部署到 Azure Spring Apps。 示例项目是基于简单待办事项 Web 应用程序的简化版本,它只提供后端服务并使用 Microsoft Entra ID 来保护 RESTful API。

这些 RESTful API 通过应用基于角色的访问控制 (RBAC) 获得保护。 匿名用户无法访问任何数据,也不允许控制不同用户的访问。 匿名用户只有以下三个权限:

  • 读取:通过此权限,用户可以读取待办事项数据。
  • 写入:通过此权限,用户可以添加或更新待办事项数据。
  • 删除:通过此权限,用户可以删除待办事项数据。

部署成功后,可以通过 Swagger UI 查看和测试 API。

Swagger UI 的屏幕截图,其中显示了 API 文档。

下图显示了系统的体系结构:

显示 Spring Web 应用程序的体系结构的示意图。

本文介绍以下用于创建资源并将其部署到 Azure Spring Apps 的选项:

  • “Azure 门户 + Maven 插件”选项提供了一种更为传统的方法,可用于分步创建资源和部署应用程序。 此选项适合首次使用 Azure 云服务的 Spring 开发人员。
  • “Azure Developer CLI”选项是一种更高效的方法,可通过简单的命令自动创建资源和部署应用程序。 Azure Developer CLI 使用模板来预配所需的 Azure 资源并部署应用程序代码。 此选项适合熟悉 Azure 云服务的 Spring 开发人员。

本文介绍以下用于创建资源并将其部署到 Azure Spring Apps 的选项:

  • “Azure 门户 + Maven 插件”选项提供了一种更为传统的方法,可用于分步创建资源和部署应用程序。 此选项适合首次使用 Azure 云服务的 Spring 开发人员。
  • “Azure CLI”选项使用功能强大的命令行工具管理 Azure 资源。 此选项适合熟悉 Azure 云服务的 Spring 开发人员。

1.先决条件

2. 准备 Spring 项目

若要部署 RESTful API 应用,第一步是准备在本地运行的 Spring 项目。

使用以下步骤在本地克隆和运行该应用:

  1. 使用以下命令从 GitHub 克隆示例项目:

    git clone https://github.com/Azure-Samples/ASA-Samples-Restful-Application.git
    
  2. 若要在本地运行应用,请先完成“公开 RESTful API”中的步骤并更新应用程序配置部分,然后使用以下命令通过 Maven 运行示例应用程序:

    cd ASA-Samples-Restful-Application
    ./mvnw spring-boot:run
    

3. 准备云环境

运行此示例应用所需的主要资源是 Azure Spring Apps 实例和 Azure Database for PostgreSQL 实例。 以下部分介绍如何创建这些资源。

3.1. 登录到 Azure 门户

转到 Azure 门户,输入登录到门户所需的凭据。 默认视图是服务仪表板。

3.2. 创建 Azure Spring Apps 实例

使用以下步骤创建 Azure Spring Apps 服务实例:

  1. 在 Azure 门户一角选择“创建资源”。

  2. 选择“计算>Azure Spring Apps”。

  3. 填写“基本”表单,其中包含以下信息:

    设置 建议值 描述
    订阅 你的订阅名称。 要用于服务器的 Azure 订阅。 如果你有多个订阅,请选择要计费的资源所在的订阅。
    资源组 myresourcegroup 新的资源组名称,或订阅中的现有资源组。
    名称 myasa 用于标识 Azure Spring Apps 服务的唯一名称。 该名称必须为 4 到 32 个字符,只能包含小写字母、数字及连字符。 服务名称的第一个字符必须是字母,最后一个字符必须是字母或数字。
    计划 企业 定价计划确定与实例关联的资源和成本。
    区域 离用户最近的区域。 最靠近用户的位置。
    区域冗余 未选定 在 Azure 可用性区域中创建 Azure Spring Apps 服务的选项。 此功能目前在所有区域都不受支持。
    软件 IP 计划 即用即付 使用 Azure Spring Apps 进行即用即付的定价计划。
    Terms 已选择 市场产品/服务关联的协议复选框。 需要选中此复选框。
    部署示例项目 未选定 使用内置示例应用程序的选项。
  4. 选择“查看 + 创建”,查看所选内容。 然后,选择“创建”以预配 Azure Spring Apps 实例

  5. 在工具栏上选择“通知”图标(铃铛)以监视部署过程。 完成部署后,可以选择“固定到仪表板”,以便在 Azure 门户仪表板上为此服务创建磁贴作为前往此服务的“概述”页的快捷方式。

    Azure 门户的屏幕截图,其中显示了用于创建 Azure Spring Apps 的“通知”窗格。

  6. 选择“转到资源”,转到“Azure Spring Apps 概述”页面。

3.3. 准备 PostgreSQL 实例

执行以下步骤以创建 Azure Database for PostgreSQL 服务器:

  1. 转到 Azure 门户,然后选择“创建资源”。

  2. 选择“数据库”>“用于 PostgreSQL 的 Azure 数据库”。

  3. 选择“灵活服务器”部署选项。

    Azure 门户的屏幕截图,其中显示了“选择 Azure Database for PostgreSQL 部署选项”页。

  4. 在“基本信息”选项卡中填写以下信息:

    • 服务器名称my-demo-pgsql
    • 区域美国东部
    • PostgreSQL 版本14
    • 工作负载类型开发
    • 启用高可用性:未选中
    • 身份验证方法仅限 PostgreSQL 身份验证
    • 管理员用户名myadmin
    • 密码确认密码:输入密码。
  5. 使用以下信息配置“网络”选项卡:

    • 连接方法公共访问(允许的 IP 地址)
    • 允许从 Azure 内的任何 Azure 服务公开访问此服务器:已选中
  6. 选择“查看 + 创建”来查看选择,然后选择“创建”以预配服务器。 此操作可能需要几分钟时间。

  7. 在 Azure 门户中转到 PostgreSQL 服务器。 在“概述”页上,查找“服务器名称”值,然后记录下来以供将来使用。 需要该值来为 Azure Spring Apps 中的应用配置环境变量。

  8. 从导航菜单中选择“数据库”以创建数据库,例如 Todo。

    Azure 门户的屏幕截图,其中显示了“数据库”页和打开的“创建数据库”窗格。

3.4. 将应用实例连接到 PostgreSQL 实例

遵循以下步骤连接服务实例:

  1. 在 Azure 门户中转到 Azure Spring Apps 实例。

  2. 在导航菜单中,打开“应用”,然后选择“创建应用”。

  3. 在“创建应用”页上,填写应用名称 simple-todo-api,然后选择“Java 项目”作为部署类型。

  4. 选择“创建”以完成应用创建,然后选择该应用以查看详细信息。

  5. 转到在 Microsoft Azure 门户中创建的应用。 在“概述”页上,选择“分配终结点”以公开应用的公共终结点。 保存 URL 以在部署后访问应用。

  6. 从导航窗格中选择“服务连接器”,然后选择“创建”以创建新的服务连接。

    Azure 门户的屏幕截图,其中显示了企业计划“服务连接器”页,并且突出显示了“创建”按钮。

  7. 在“基本信息”选项卡中填写以下信息:

    • 服务类型DB for PostgreSQL 灵活服务器
    • 连接名称:填充自动生成的名称,也可以对其进行修改。
    • 订阅:选择订阅。
    • PostgreSQL 灵活服务器my-demo-pgsql
    • PostgreSQL 数据库:选择创建的数据库。
    • 客户端类型SpringBoot

    Azure 门户的屏幕截图,其中显示了用于连接到服务总线的“创建连接”窗格的“基本信息”选项卡。

  8. 使用以下信息配置配置“下一步: 身份验证”选项卡:

    • 选择要在计算服务和目标服务之间使用的身份验证类型:选择“连接字符串”。
    • 使用...以继续:选择“数据库凭据
    • 用户名myadmin
    • 密码:输入密码。

    Azure 门户的屏幕截图,其中显示了“创建连接”窗格的“身份验证”选项卡,并且突出显示了“连接字符串”选项。

  9. 选择“下一页:网络”。 使用默认选项“配置防火墙规则以启用对目标服务的访问权限”。

  10. 选择“下一步: 查看并创建”以查看选择,然后选择“创建”以创建连接。

3.5. 公开 RESTful API

使用以下步骤以在 Microsoft Entra ID 中公开 RESTful API:

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请使用“目录 + 订阅”筛选器 (),选择要在其中注册应用程序的租户。

  3. 搜索并选择 Microsoft Entra ID

  4. 在“管理”下,选择“应用注册”>“新建注册” 。

  5. 在“名称”字段中输入应用程序的名称 - 例如“待办事项”。 应用的用户可能会看到此名称,你稍后可对其进行更改。

  6. 对于“支持的帐户类型”,选择“任何组织目录(任何 Microsoft Entra 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如 Skype、Xbox)”。

  7. 选择“注册”以创建应用程序。

  8. 在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要该值来为此项目配置 YAML 配置文件。

  9. 在“管理”下,选择“公开 API”,在页面开头找到“应用程序 ID URI”,然后选择“添加”。

  10. 在“编辑应用程序 ID URI”页面,接受建议的应用程序 ID URI (api://{client ID}) 或使用有意义的名称而不是客户端 ID(例如 api://simple-todo),然后选择“保存”。

  11. 在“管理”下,选择“公开 API”>添加作用域”,然后输入以下信息:

    • 对于“作用域名称”,请输入“ToDo.Read”。
    • 对于“需要获取谁的同意”,请选择“仅管理员”。
    • 对于“管理员同意显示名”,请输入“读取待办事项数据”。
    • 对于“管理员同意说明”,请输入“允许经过身份验证的用户读取待办事项数据”。
    • 对于“状态”,请保持启用状态。
    • 选择“添加作用域”。
  12. 重复上述步骤以添加其他两个作用域:ToDo.WriteToDo.Delete

    Azure 门户的屏幕截图,其中显示了 RESTful API 应用程序的“公开 API”页。

3.6. 更新应用程序配置

使用以下步骤更新 YAML 文件,以通过 Microsoft Entra 注册的应用程序信息与 RESTful API 应用程序建立关系:

  1. 找到 simple-todo-api 应用的 src/main/resources/application.yml 文件。 更新 spring.cloud.azure.active-directory 部分中的配置以匹配以下示例。 请务必将占位符替换为之前创建的值。

    spring:
      cloud:
        azure:
          active-directory:
            profile:
              tenant-id: <tenant>
            credential:
              client-id: <your-application-ID-of-ToDo>
            app-id-uri: <your-application-ID-URI-of-ToDo>
    

    注意

    在 v1.0 令牌中,配置需要 API 的客户端 ID,而在 v2.0 令牌中,可以在请求中使用客户端 ID 或应用程序 ID URI。 可以同时配置这两项以正确完成受众验证。

    tenant-id 允许的值包括:commonorganizationsconsumers或租户 ID。 有关这些值的详细信息,请参阅错误 AADSTS50020 - 来自标识提供者的用户帐户不存在于租户中部分中的使用了错误的终结点(个人和组织帐户)部分。 有关转换单租户应用的信息,请参阅将单租户应用转换为 Microsoft Entra ID 上的多租户

  2. 使用以下命令重新生成示例项目:

    ./mvnw clean package
    

4. 将应用部署到 Azure Spring Apps

现在可以将应用部署到 Azure Spring Apps。

按照以下步骤,使用适用于 Azure Spring Apps 的 Maven 插件进行部署:

  1. 导航到完整目录,然后运行以下命令以在 Azure Spring Apps 中配置应用

    ./mvnw com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config
    

    以下列表描述了命令交互:

    • OAuth2 登录:你需要根据 OAuth2 协议授权到 Azure 的登录。
    • 选择订阅:选择所创建的 Azure Spring Apps 实例的订阅列表编号,它默认为列表中的第一个订阅。 如果使用默认编号,请直接按 Enter
    • 使用 Azure 中的现有 Azure Spring Apps:按 y 使用现有的 Azure Spring Apps 实例。
    • 选择要部署的 Azure Spring Apps:选择创建的 Azure Spring Apps 实例的编号。 如果使用默认编号,请直接按 Enter
    • 在 Azure Spring Apps 中使用现有应用 <your-instance-name>:按 y 使用已创建的应用。
    • 确认保存上述所有配置:按 y。 如果按 n,则配置不会保存在 POM 文件中。
  2. 使用以下命令部署应用:

    ./mvnw azure-spring-apps:deploy
    

    以下列表描述了命令交互:

    • OAuth2 登录:你需要根据 OAuth2 协议授权到 Azure 的登录。

    执行命令后,你会从以下日志消息中看到部署已成功:

[INFO] Deployment Status: Running
[INFO]   InstanceName:simple-todo-api-default-15-xxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:N/A       
[INFO] Getting public url of app(simple-todo-api)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-simple-todo-api.azuremicroservices.io

5. 验证应用

现在可以访问 RESTful API 以查看它是否正常工作。

5.1. 请求访问令牌

RESTful API 作用是资源服务器,它受到 Microsoft Entra ID 的保护。 在获取访问令牌之前,必须在 Microsoft Entra ID 中注册另一个应用程序,然后将权限授予名为“ToDoWeb”的客户端应用程序。

注册客户端应用程序

使用以下步骤在 Microsoft Entra ID 中注册应用程序,该应用程序用于向 ToDo 应用添加权限:

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请使用“目录 + 订阅”筛选器 (),选择要在其中注册应用程序的租户。

  3. 搜索并选择 Microsoft Entra ID

  4. 在“管理”下,选择“应用注册”>“新建注册” 。

  5. 在“名称”字段中输入应用程序的名称 - 例如“ToDoWeb”。 应用的用户可能会看到此名称,你稍后可对其进行更改。

  6. 对于“支持的帐户类型”,请使用默认值“仅限此组织目录中的帐户”。

  7. 选择“注册”以创建应用程序。

  8. 在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要该值来获取访问令牌。

  9. 选择“API 权限”>“添加权限”>“我的 API”。 选择之前注册的 ToDo 应用程序,然后选择“ToDo.Read”、“ToDo.Write”和“ToDo.Delete”权限。 选择“添加权限”。

  10. 选择“为 <your-tenant-name> 授予管理员同意”,为添加的权限授予管理员同意。

    Azure 门户的屏幕截图,其中显示了 Web 应用程序的 API 权限。

添加用户以访问 RESTful API

使用以下步骤在 Microsoft Entra 租户中创建成员用户。 然后,用户可以通过 RESTful API 管理 ToDo 应用程序的数据。

  1. 在“管理”下 ,选择“用户”>“新用户”>“创建新用户”。

  2. 在“创建新用户”页上输入以下信息:

    • 用户主体名称:输入用户的名称。
    • 显示名称:输入用户的显示名称。
    • 密码复制“密码”框中提供的自动生成的密码。

    注意

    新用户必须完成首次登录身份验证并更新密码,否则,在获取访问令牌时会收到以下错误 AADSTS50055: The password is expired

    新用户在登录时会收到“需要用户操作”的提示。 用户可以选择“稍后询问”以跳过验证。

  3. 选择“查看 + 创建”,查看所选内容。 选择“创建”以创建用户。

为 Swagger UI 授权更新 OAuth2 配置

使用以下步骤为 Swagger UI 授权更新 OAuth2 配置。 然后,就可以授权用户通过 ToDoWeb 应用获取访问令牌。

  1. 在 Azure 门户中打开“Microsoft Entra ID”租户,并转到已注册的 ToDoWeb 应用。

  2. 在“管理”下,选择“身份验证”,选择“添加平台”,然后选择“单页应用程序”。

  3. 使用 <your-app-exposed-application-URL-or-endpoint>/swagger-ui/oauth2-redirect.html 格式作为“重定向 URI”字段中的 OAuth2 重定向 URL,然后选择“配置”。

    Azure 门户的屏幕截图,其中显示了 Microsoft Entra ID 的“身份验证”页。

2. 准备 Spring 项目

若要部署 RESTful API 应用,第一步是准备在本地运行的 Spring 项目。

使用以下步骤在本地克隆和运行该应用:

  1. 使用以下命令从 GitHub 克隆示例项目:

    git clone https://github.com/Azure-Samples/ASA-Samples-Restful-Application.git
    
  2. 若要在本地运行应用,请先完成“公开 RESTful API”中的步骤并更新应用程序配置部分,然后使用以下命令通过 Maven 运行示例应用程序:

    cd ASA-Samples-Restful-Application
    ./mvnw spring-boot:run
    

3. 准备云环境

运行此示例应用所需的主要资源是 Azure Spring Apps 实例和 Azure Database for PostgreSQL 实例。 以下部分介绍如何创建这些资源。

3.1. 登录到 Azure 门户

转到 Azure 门户,输入登录到门户所需的凭据。 默认视图是服务仪表板。

3.2. 创建 Azure Spring Apps 实例

遵循以下步骤来创建服务实例:

  1. 在门户的角落选择“创建资源”。

  2. 选择“计算>Azure Spring Apps”。

  3. 填写“基本”窗体。 以下表为指南来填写窗体。 建议的“Plan”值为“标准消耗和专用资源(预览版)”。

    设置 建议值 描述
    订阅 你的订阅名称。 要用于服务器的 Azure 订阅。 如果你有多个订阅,请选择要计费的资源所在的订阅。
    资源组 myresourcegroup 新的资源组名称,或订阅中的现有资源组。
    名称 myasa 用于标识 Azure Spring Apps 服务的唯一名称。 该名称必须为 4 到 32 个字符,只能包含小写字母、数字及连字符。 服务名称的第一个字符必须是字母,最后一个字符必须是字母或数字。
    计划 标准消耗和专用型(预览版) 定价层会确定与实例关联的资源和成本。
    区域 离用户最近的区域。 最靠近用户的位置。
    容器应用环境 myenvironment 用于选择哪个 Azure 容器应用环境实例与其他服务和资源共享相同的虚拟网络的选项。

    使用下表作为容器应用环境创建的指南:

    设置 建议值 说明
    环境名称 myenvironment 识别 Azure 容器应用环境服务的唯一名称。
    计划 消耗 定价层会确定与实例关联的资源和成本。
    区域冗余 已禁用 用于在 Azure 可用性区域中创建容器应用环境服务的选项。
  4. 选择“查看 + 创建”,查看所选内容。 然后,选择“创建”以预配 Azure Spring Apps 实例

  5. 在工具栏上选择“通知”图标(铃铛)以监视部署过程。 完成部署后,可以选择“固定到仪表板”,以便在 Azure 门户仪表板上为此服务创建磁贴作为前往此服务的“概述”页的快捷方式。

  6. 选择“转到资源”以打开服务的“概述”页。

    Azure 门户的屏幕截图,其中显示了“概述”页面和打开的“通知”页面。

重要

消耗工作负荷配置文件有一个没有初始成本的即用即付计费模型。 系统会根据预配的资源对专用工作负荷配置文件收费。 有关详细信息,请参阅 Azure 容器应用中的工作负载配置文件Azure Spring Apps 定价

3.3. 准备 PostgreSQL 实例

执行以下步骤以创建 Azure Database for PostgreSQL 服务器:

  1. 转到 Azure 门户,然后选择“创建资源”。

  2. 选择“数据库”>“用于 PostgreSQL 的 Azure 数据库”。

  3. 选择“灵活服务器”部署选项。

    Azure 门户的屏幕截图,其中显示了“选择 Azure Database for PostgreSQL 部署选项”页。

  4. 在“基本信息”选项卡中填写以下信息:

    • 服务器名称my-demo-pgsql
    • 区域美国东部
    • PostgreSQL 版本14
    • 工作负载类型开发
    • 启用高可用性:未选中
    • 身份验证方法仅限 PostgreSQL 身份验证
    • 管理员用户名myadmin
    • 密码确认密码:输入密码。
  5. 使用以下信息配置“网络”选项卡:

    • 连接方法公共访问(允许的 IP 地址)
    • 允许从 Azure 内的任何 Azure 服务公开访问此服务器:已选中
  6. 选择“查看 + 创建”来查看选择,然后选择“创建”以预配服务器。 此操作可能需要几分钟时间。

  7. 在 Azure 门户中转到 PostgreSQL 服务器。 在“概述”页上,查找“服务器名称”值,然后记录下来以供将来使用。 需要该值来为 Azure Spring Apps 中的应用配置环境变量。

  8. 从导航菜单中选择“数据库”以创建数据库,例如 Todo。

    Azure 门户的屏幕截图,其中显示了“数据库”页和打开的“创建数据库”窗格。

3.4. 将应用实例连接到 PostgreSQL 实例

遵循以下步骤连接服务实例:

  1. 在 Azure 门户中转到 Azure Spring Apps 实例。

  2. 在导航菜单中,打开“应用”,然后选择“创建应用”。

  3. 在“创建应用”页上,填写应用名称“simple-todo-api”,并选择“Java 项目”作为部署类型。

  4. 选择“创建”以完成应用创建,然后选择该应用以查看详细信息。

  5. 转到在 Microsoft Azure 门户中创建的应用。 在“概述”页上,选择“分配终结点”以公开应用的公共终结点。 保存 URL 以在部署后访问应用。

  6. 转到已创建的应用,展开“设置”,从导航菜单中选择“配置”,然后选择“环境变量”以设置环境变量。

  7. 为 PostgreSQL 连接添加以下环境变量,然后选择“保存”以完成应用配置更新。 请确保将占位符替换为之前自己创建的值。

    环境变量 Value
    SPRING_DATASOURCE_URL jdbc:postgresql://<your-PostgreSQL-server-name>:5432/<your-PostgreSQL-database-name>
    SPRING_DATASOURCE_USERNAME <your-PostgreSQL-admin-user>
    SPRING_DATASOURCE_PASSWORD <your-PostgreSQL-admin-password>

    Azure 门户的屏幕截图,其中显示了“环境变量”选项卡和 PostgreSQL 连接的所有值。

3.5. 公开 RESTful API

使用以下步骤以在 Microsoft Entra ID 中公开 RESTful API:

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请使用“目录 + 订阅”筛选器 (),选择要在其中注册应用程序的租户。

  3. 搜索并选择 Microsoft Entra ID

  4. 在“管理”下,选择“应用注册”>“新建注册” 。

  5. 在“名称”字段中输入应用程序的名称 - 例如“待办事项”。 应用的用户可能会看到此名称,你稍后可对其进行更改。

  6. 对于“支持的帐户类型”,选择“任何组织目录(任何 Microsoft Entra 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如 Skype、Xbox)”。

  7. 选择“注册”以创建应用程序。

  8. 在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要该值来为此项目配置 YAML 配置文件。

  9. 在“管理”下,选择“公开 API”,在页面开头找到“应用程序 ID URI”,然后选择“添加”。

  10. 在“编辑应用程序 ID URI”页面,接受建议的应用程序 ID URI (api://{client ID}) 或使用有意义的名称而不是客户端 ID(例如 api://simple-todo),然后选择“保存”。

  11. 在“管理”下,选择“公开 API”>添加作用域”,然后输入以下信息:

    • 对于“作用域名称”,请输入“ToDo.Read”。
    • 对于“需要获取谁的同意”,请选择“仅管理员”。
    • 对于“管理员同意显示名”,请输入“读取待办事项数据”。
    • 对于“管理员同意说明”,请输入“允许经过身份验证的用户读取待办事项数据”。
    • 对于“状态”,请保持启用状态。
    • 选择“添加作用域”。
  12. 重复上述步骤以添加其他两个作用域:ToDo.WriteToDo.Delete

    Azure 门户的屏幕截图,其中显示了 RESTful API 应用程序的“公开 API”页。

3.6. 更新应用程序配置

使用以下步骤更新 YAML 文件,以通过 Microsoft Entra 注册的应用程序信息与 RESTful API 应用程序建立关系:

  1. 找到 simple-todo-api 应用的 src/main/resources/application.yml 文件。 更新 spring.cloud.azure.active-directory 部分中的配置以匹配以下示例。 请务必将占位符替换为之前创建的值。

    spring:
      cloud:
        azure:
          active-directory:
            profile:
              tenant-id: <tenant>
            credential:
              client-id: <your-application-ID-of-ToDo>
            app-id-uri: <your-application-ID-URI-of-ToDo>
    

    注意

    在 v1.0 令牌中,配置需要 API 的客户端 ID,而在 v2.0 令牌中,可以在请求中使用客户端 ID 或应用程序 ID URI。 可以同时配置这两项以正确完成受众验证。

    tenant-id 允许的值包括:commonorganizationsconsumers或租户 ID。 有关这些值的详细信息,请参阅错误 AADSTS50020 - 来自标识提供者的用户帐户不存在于租户中部分中的使用了错误的终结点(个人和组织帐户)部分。 有关转换单租户应用的信息,请参阅将单租户应用转换为 Microsoft Entra ID 上的多租户

  2. 使用以下命令重新生成示例项目:

    ./mvnw clean package
    

4. 将应用部署到 Azure Spring Apps

现在可以将应用部署到 Azure Spring Apps。

按照以下步骤,使用适用于 Azure Spring Apps 的 Maven 插件进行部署:

  1. 导航到完整目录,然后运行以下命令以在 Azure Spring Apps 中配置应用

    ./mvnw com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config
    

    以下列表描述了命令交互:

    • OAuth2 登录:你需要根据 OAuth2 协议授权到 Azure 的登录。
    • 选择订阅:选择所创建的 Azure Spring Apps 实例的订阅列表编号,它默认为列表中的第一个订阅。 如果使用默认编号,请直接按 Enter
    • 使用 Azure 中的现有 Azure Spring Apps:按 y 使用现有的 Azure Spring Apps 实例。
    • 选择要部署的 Azure Spring Apps:选择创建的 Azure Spring Apps 实例的编号。 如果使用默认编号,请直接按 Enter
    • 在 Azure Spring Apps 中使用现有应用 <your-instance-name>:按 y 使用已创建的应用。
    • 确认保存上述所有配置:按 y。 如果按 n,则配置不会保存在 POM 文件中。
  2. 使用以下命令部署应用:

    ./mvnw azure-spring-apps:deploy
    

    以下列表描述了命令交互:

    • OAuth2 登录:你需要根据 OAuth2 协议授权到 Azure 的登录。

    执行命令后,你会从以下日志消息中看到部署已成功:

[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO]   InstanceName:demo--default-xxxxxxx-xxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:NONE
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://demo.<unique-identifier>.<region-name>.azurecontainerapps.io

5. 验证应用

现在可以访问 RESTful API 以查看它是否正常工作。

5.1. 请求访问令牌

RESTful API 作用是资源服务器,它受到 Microsoft Entra ID 的保护。 在获取访问令牌之前,必须在 Microsoft Entra ID 中注册另一个应用程序,然后将权限授予名为“ToDoWeb”的客户端应用程序。

注册客户端应用程序

使用以下步骤在 Microsoft Entra ID 中注册应用程序,该应用程序用于向 ToDo 应用添加权限:

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请使用“目录 + 订阅”筛选器 (),选择要在其中注册应用程序的租户。

  3. 搜索并选择 Microsoft Entra ID

  4. 在“管理”下,选择“应用注册”>“新建注册” 。

  5. 在“名称”字段中输入应用程序的名称 - 例如“ToDoWeb”。 应用的用户可能会看到此名称,你稍后可对其进行更改。

  6. 对于“支持的帐户类型”,请使用默认值“仅限此组织目录中的帐户”。

  7. 选择“注册”以创建应用程序。

  8. 在应用的“概述”页上,找到“应用程序(客户端) ID”值,然后记下该值以供后续使用 。 需要该值来获取访问令牌。

  9. 选择“API 权限”>“添加权限”>“我的 API”。 选择之前注册的 ToDo 应用程序,然后选择“ToDo.Read”、“ToDo.Write”和“ToDo.Delete”权限。 选择“添加权限”。

  10. 选择“为 <your-tenant-name> 授予管理员同意”,为添加的权限授予管理员同意。

    Azure 门户的屏幕截图,其中显示了 Web 应用程序的 API 权限。

添加用户以访问 RESTful API

使用以下步骤在 Microsoft Entra 租户中创建成员用户。 然后,用户可以通过 RESTful API 管理 ToDo 应用程序的数据。

  1. 在“管理”下 ,选择“用户”>“新用户”>“创建新用户”。

  2. 在“创建新用户”页上输入以下信息:

    • 用户主体名称:输入用户的名称。
    • 显示名称:输入用户的显示名称。
    • 密码复制“密码”框中提供的自动生成的密码。

    注意

    新用户必须完成首次登录身份验证并更新密码,否则,在获取访问令牌时会收到以下错误 AADSTS50055: The password is expired

    新用户在登录时会收到“需要用户操作”的提示。 用户可以选择“稍后询问”以跳过验证。

  3. 选择“查看 + 创建”,查看所选内容。 选择“创建”以创建用户。

为 Swagger UI 授权更新 OAuth2 配置

使用以下步骤为 Swagger UI 授权更新 OAuth2 配置。 然后,就可以授权用户通过 ToDoWeb 应用获取访问令牌。

  1. 在 Azure 门户中打开“Microsoft Entra ID”租户,并转到已注册的 ToDoWeb 应用。

  2. 在“管理”下,选择“身份验证”,选择“添加平台”,然后选择“单页应用程序”。

  3. 使用 <your-app-exposed-application-URL-or-endpoint>/swagger-ui/oauth2-redirect.html 格式作为“重定向 URI”字段中的 OAuth2 重定向 URL,然后选择“配置”。

    Azure 门户的屏幕截图,其中显示了 Microsoft Entra ID 的“身份验证”页。

获取访问令牌

通过以下步骤使用 OAuth 2.0 授权代码流方法来获取具有 Microsoft Entra ID 的访问令牌,然后访问 ToDo 应用的 RESTful API:

  1. 打开应用公开的 URL,然后选择“授权”以准备进行 OAuth2 身份验证。

  2. 在“可用授权”窗口中,在“client_id”字段中输入 ToDoWeb 应用的客户端 ID,选择“作用域”字段的所有作用域,忽略“client_secret”字段,然后选择“授权”以重定向到 Microsoft Entra 登录页。

完成上一个用户的登录后,将返回到“可用授权”窗口。

5.2. 访问 RESTful API

通过以下步骤访问 Swagger UI 中 ToDo 应用的 RESTful API:

  1. 选择 API“POST /api/simple-todo/lists”,然后选择“试用”。输入以下请求正文,然后选择“执行”以创建待办事项列表。

    {
      "name": "My List"
    }
    

    执行完成后,会看到以下“响应正文”:

    {
      "id": "<ID-of-the-ToDo-list>",
      "name": "My List",
      "description": null
    }
    
  2. 选择 API“POST /api/simple-todo/lists/{listId}/items”,然后选择“试用”。对于“listId”,输入之前创建的待办事项列表 ID,输入以下请求正文,然后选择“执行”以创建待办事项项目。

    {
      "name": "My first ToDo item", 
      "listId": "<ID-of-the-ToDo-list>",
      "state": "todo"
    }
    

    此操作返回以下待办事项项目:

    {
      "id": "<ID-of-the-ToDo-item>",
      "listId": "<ID-of-the-ToDo-list>",
      "name": "My first ToDo item",
      "description": null,
      "state": "todo",
      "dueDate": "2023-07-11T13:59:24.9033069+08:00",
      "completedDate": null
    }
    
  3. 选择 API“GET /api/simple-todo/lists”,然后选择“执行”以查询待办事项列表。 此操作返回以下待办事项列表:

    [
      {
        "id": "<ID-of-the-ToDo-list>",
        "name": "My List",
        "description": null
      }
    ]
    
  4. 选择 API“GET /api/simple-todo/lists/{listId}/items”,然后选择“试用”。对于“listId”,输入之前创建的待办事项列表 ID,然后选择“执行”以查询待办事项项目。 此操作返回以下待办事项项目:

    [
      {
        "id": "<ID-of-the-ToDo-item>",
        "listId": "<ID-of-the-ToDo-list>",
        "name": "My first ToDo item",
        "description": null,
        "state": "todo",
        "dueDate": "2023-07-11T13:59:24.903307+08:00",
        "completedDate": null
      }
    ]
    
  5. 选择 API“PUT /api/simple-todo/lists/{listId}/items/{itemId}”,然后选择“试用”。对于“listId”,请输入待办事项列表 ID。 对于“itemId”,输入待办事项 ID,输入以下请求正文,然后选择“执行”以更新待办事项项目。

    {
      "id": "<ID-of-the-ToDo-item>",
      "listId": "<ID-of-the-ToDo-list>",
      "name": "My first ToDo item",
      "description": "Updated description.",
      "dueDate": "2023-07-11T13:59:24.903307+08:00",
      "state": "inprogress"
    }
    

    此操作返回以下更新的待办事项项目:

    {
      "id": "<ID-of-the-ToDo-item>",
      "listId": "<ID-of-the-ToDo-list>",
      "name": "My first ToDo item",
      "description": "Updated description.",
      "state": "inprogress",
      "dueDate": "2023-07-11T05:59:24.903307Z",
      "completedDate": null
    }
    
  6. 选择 API“DELETE /api/simple-todo/lists/{listId}/items/{itemId}”,然后选择“试用”。对于“listId”,请输入待办事项列表 ID。 对于“itemId”,输入待办事项 ID,然后选择“执行”以删除待办事项项目。 这时会看到服务器响应代码为 204

6.清理资源

可以删除 Azure 资源组,其中包括资源组中的所有资源。

按照以下步骤删除整个资源组(包括新创建的服务器):

  1. 在 Azure 门户中查找资源组。

  2. 在导航菜单上,选择“资源组”。 然后选择资源组的名称 - 例如 myresourcegroup

  3. 在资源组页上,选择“删除”。 在文本框中输入资源组的名称(例如 myresourcegroup)以确认删除。 然后选择“删除”。

按照以下步骤删除整个资源组(包括新创建的服务器):

  1. 在 Azure 门户中查找资源组。

  2. 在导航菜单上,选择“资源组”。 然后选择资源组的名称 - 例如 myresourcegroup

  3. 在资源组页上,选择“删除”。 在文本框中输入资源组的名称(例如 myresourcegroup)以确认删除。 然后选择“删除”。

7. 后续步骤

有关详细信息,请参阅以下文章: