Skip to main content

适用于 Copilot 扩展的 OpenID Connect (OIDC)

了解 OpenID Connect (OIDC) 如何使 Copilot 扩展 能够安全地对用户进行身份验证并访问云资源,而无需存储长期有效的凭据。

关于适用于 Copilot 扩展的 OpenID Connect (OIDC)

OpenID Connect(OIDC)允许 Copilot 扩展直接从其云提供商交换短期有效的令牌,而不是存储长期有效的 GitHub 凭据。 此功能使 Copilot 代理和技能组能够更安全地对用户进行身份验证和访问云资源。

OIDC 概述

Copilot 扩展通常需要代表用户访问第三方资源或 API。 传统上,这需要将 GitHub 令牌存储为机密,并进行额外的 API 调用,以将这些令牌映射到系统中的用户标识。 凭借 OIDC,扩展可通过交换 GitHub 标识信息直接从身份验证服务请求短期有效的访问令牌。

启用后,GitHub 的 OIDC 提供程序会自动生成一个令牌,其中包含有关用户和请求上下文的声明。 身份验证服务可以验证这些声明,并将其交换为专门针对服务限定范围的访问令牌。

使用 OIDC 对 Copilot 技能组开发尤其有价值,因为它使你能够利用现有 API 终结点,而无需维护单独的特定于 GitHub 的终结点。 不必复制终结点来接受 GitHub 令牌,而是可以使用 OIDC 将 GitHub 标识转换为服务的原生身份验证令牌。

使用 OIDC 的好处

通过在 Copilot 扩展中实现 OIDC 令牌交换,你可以:

  • 避免存储长期有效的 GitHub 令牌或维护 GitHub 与服务的标识之间的映射。
  • 使用短期有效的令牌,这些令牌会自动过期,可专门针对服务需求限定范围。
  • 避免对 GitHub 的 API 进行额外调用,以验证令牌并提取用户信息。
  • 使用现有 API 为 Copilot 技能启用直接集成,而无需为 GitHub 维护单独的终结点。
  • 通过将 GitHub 身份验证转换为服务的原生令牌来重复使用现有 API 终结点。

关于令牌交换流

下面概述了 Copilot 扩展性平台 如何将 OIDC 令牌交换为访问令牌,以便对向扩展发出的请求进行身份验证。

初始请求

  1. 用户向 Copilot 扩展发送一条消息。
  2. GitHub 生成包含用户标识信息的 OIDC 令牌。
  3. GitHub 使用 OIDC 令牌调用令牌交换终结点。
  4. 服务验证令牌并返回访问令牌。
  5. GitHub 在对扩展的请求中包含访问令牌。
# HTTP header
Authorization: Bearer <your-service-token>
X-GitHub-Token: <github-token>

后续请求

  1. GitHub 缓存访问令牌,时间最长可达 10 分钟。
  2. 缓存的令牌供后续请求重复使用。
  3. 如果令牌过期或失效,GitHub 会请求一个新令牌。

了解 OIDC 令牌

GitHub 中的 OIDC 令牌是一个 JWT,其中包含有关用户和请求上下文的声明:

{
  "jti": "<unique-token-id>",
  "sub": "<github-user-id>",
  "aud": "<your-client-id>",
  "iss": "https://github.com/login/oauth",
  "nbf": 1632492967,
  "exp": 1632493867,
  "iat": 1632493567,
  "act": {
    "sub": "api.copilotchat.com"
  }
}

最佳做法

  • 将令牌范围限定为所需的最低权限。
  • 实现正确的错误处理和记录。
  • 监视令牌交换模式是否存在安全异常。
  • 使令牌保持在短期内有效,以最大程度降低安全风险。
  • 在颁发访问令牌前验证所有声明。
  • 考虑在令牌交换终结点上实现速率限制。
  • 对所有令牌交换通信使用 HTTPS。

后续步骤