关于适用于 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 令牌交换为访问令牌,以便对向扩展发出的请求进行身份验证。
初始请求
- 用户向 Copilot 扩展发送一条消息。
- GitHub 生成包含用户标识信息的 OIDC 令牌。
- GitHub 使用 OIDC 令牌调用令牌交换终结点。
- 服务验证令牌并返回访问令牌。
- GitHub 在对扩展的请求中包含访问令牌。
# HTTP header
Authorization: Bearer <your-service-token>
X-GitHub-Token: <github-token>
后续请求
- GitHub 缓存访问令牌,时间最长可达 10 分钟。
- 缓存的令牌供后续请求重复使用。
- 如果令牌过期或失效,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。