练习 - 将 API 插件与使用密钥保护的 API 集成

已完成

智能 Microsoft 365 Copilot 副驾驶®的 API 插件允许你与使用密钥保护的 API 集成。 通过在 Teams 保管库中注册 API 密钥,可以保护该密钥的安全。 在运行时,智能 Microsoft 365 Copilot 副驾驶®执行插件,从保管库中检索 API 密钥,并使用它调用 API。 通过遵循此过程,API 密钥将保持安全,并且永远不会向客户端公开。

新建项目

首先,为 智能 Microsoft 365 Copilot 副驾驶® 创建新的 API 插件。 打开 Visual Studio Code。

在 Visual Studio Code:

  1. 活动栏 (侧栏) ,激活 Microsoft 365 代理工具包扩展。
  2. “Microsoft 365 代理工具包 ”扩展面板中,选择 “创建新应用”。
  3. 从项目模板列表中选择 “Copilot 代理”。
  4. 从应用功能列表中选择“ 声明性代理”。
  5. 选择 “添加插件” 选项。
  6. 选择 “使用新 API 开始” 选项。
  7. 从身份验证类型列表中,选择“ API 密钥 (持有者令牌身份验证) ”。
  8. 作为编程语言,选择 “TypeScript”。
  9. 选择要存储项目的文件夹。
  10. 将项目命名 为 da-repairs-key

Microsoft 365 代理工具包会创建一个新项目,其中包括声明性代理、API 插件和使用密钥保护的 API。

检查 API 密钥身份验证配置

在继续之前,请检查生成的项目中的 API 密钥身份验证配置。

检查 API 定义

首先,了解如何在 API 定义中定义 API 密钥身份验证。

在 Visual Studio Code:

  1. 打开 appPackage/apiSpecificationFile/repair.yml 文件。 此文件包含 API 的 OpenAPI 定义。

  2. components.securitySchemes 部分中,请注意 apiKey 属性:

    components:
      securitySchemes:
        apiKey:
          type: http
          scheme: bearer
    

    属性定义一个安全方案,该方案使用 API 密钥作为授权请求标头中的持有者令牌。

  3. 找到 paths./repairs.get.security 属性。 请注意,它引用 apiKey 安全方案。

    [...]
    paths:
      /repairs:
        get:
          operationId: listRepairs
          [...]
          security:
            - apiKey: []
    [...] 
    

检查 API 实现

接下来,了解 API 如何针对每个请求验证 API 密钥。

在 Visual Studio Code:

  1. 打开 src/functions/repairs.ts 文件。

  2. 修复 处理程序函数中,找到以下拒绝所有未授权请求的行:

    if (!isApiKeyValid(req)) {
      // Return 401 Unauthorized response.
      return {
        status: 401,
      };
    } 
    
  3. isApiKeyValid 函数在 repairs.ts 文件中进一步实现:

    function isApiKeyValid(req: HttpRequest): boolean {
      const apiKey = req.headers.get("Authorization")?.replace("Bearer ", "").trim();
      return apiKey === process.env.API_KEY;
    }
    

    函数检查授权标头是否包含持有者令牌,并将其与 API_KEY 环境变量中定义的 API 密钥进行比较。

此代码演示 API 密钥安全性的简单实现,但它演示了 API 密钥安全性在实践中的工作原理。

检查保管库任务配置

在此项目中,使用 Microsoft 365 代理工具包将 API 密钥添加到保管库。 Microsoft 365 代理工具包使用项目配置中的特殊任务在保管库中注册 API 密钥。

在 Visual Studio Code:

  1. 打开 ./teampsapp.local.yml 文件。

  2. 预配 部分中,找到 apiKey/register 任务。

    # Register API KEY
    - uses: apiKey/register
      with:
        # Name of the API Key
        name: apiKey
        # Value of the API Key
        primaryClientSecret: ${{SECRET_API_KEY}}
        # Teams app ID
        appId: ${{TEAMS_APP_ID}}
        # Path to OpenAPI description document
        apiSpecPath: ./appPackage/apiSpecificationFile/repair.yml
      # Write the registration information of API Key into environment file for
      # the specified environment variable(s).
      writeToEnvironmentFile:
        registrationId: APIKEY_REGISTRATION_ID
    

    该任务采用存储在 env/.env.local.user 文件中的 SECRET_API_KEY 项目变量的值,并将其注册到保管库中。 然后,它获取保管库条目 ID 并将其写入环境文件 env/.env.local。 此任务的结果是名为 APIKEY_REGISTRATION_ID 的环境变量。 Microsoft 365 Agents Toolkit 将此变量的值写入包含插件定义的 appPackages/ai-plugin.json 文件。 在运行时,加载 API 插件的声明性代理使用此 ID 从保管库检索 API 密钥,并安全地调用 API。

配置用于本地开发的 API 密钥

在测试项目之前,需要为 API 定义 API 密钥。 然后,将 API 密钥存储在保管库中,并在 API 插件中记录保管库条目 ID。 对于本地开发,请将 API 密钥存储在项目中,并使用 Microsoft 365 代理工具包将其注册到保管库中。

在 Visual Studio Code:

  1. 打开“ 终端 ”窗格。

  2. 在命令行中:

    1. 通过运行 npm install来还原项目的依赖项。
    2. 通过运行 生成新的 API 密钥: npm run keygen
    3. 将生成的密钥复制到剪贴板。
  3. 打开 env/.env.local.user 文件。

  4. SECRET_API_KEY 属性更新为新生成的 API 密钥。 更新的属性如下所示:

    SECRET_API_KEY=your_key
    
  5. 保存所做的更改。

每次生成项目时,Microsoft 365 Agents Toolkit 都会自动更新保管库中的 API 密钥,并使用保管库条目 ID 更新项目。

在 智能 Microsoft 365 Copilot 副驾驶® 中使用 API 插件测试声明性代理

最后一步是使用 智能 Microsoft 365 Copilot 副驾驶® 中的 API 插件测试声明性代理。

在 Visual Studio Code:

  1. 在活动栏中,激活 Microsoft 365 代理工具包 扩展。

  2. Microsoft 365 代理工具包 扩展面板中的 “帐户 ”部分中,确保已登录到启用了 Copilot 的 Microsoft 365 租户。

    Microsoft 365 代理工具包的屏幕截图,其中显示了与 Microsoft 365 的连接状态。

  3. 在活动栏中,切换到“运行和调试”视图。

  4. 从配置列表中,选择 “在 Copilot (Edge) 中调试 ”,然后按播放按钮开始调试。

    Visual Studio Code中调试选项的屏幕截图。

    Visual Studio Code使用智能 Microsoft 365 Copilot 副驾驶®打开新的 Web 浏览器。 如果出现提示,请使用 Microsoft 365 帐户登录。

在 Web 浏览器中:

  1. 在侧面板中,选择 da-repairs-keylocal 代理。

    智能 Microsoft 365 Copilot 副驾驶®中显示的自定义代理的屏幕截图。

  2. 在提示文本框中,键入 What repairs are assigned to Karin? 并提交提示。

  3. 确认要使用 “始终允许 ”按钮将数据发送到 API 插件。

    允许将数据发送到 API 的提示的屏幕截图。

  4. 等待代理响应。

    自定义代理对用户提示的响应的屏幕截图。

完成测试后,停止Visual Studio Code中的调试会话。