# OpenID Connect

OpenID Connect 允许您的工作流程直接从云提供商交换短期令牌。

## OpenID Connect (OIDC) 概述

GitHub Actions 工作流通常旨在访问云提供商（例如 AWS、Azure、GCP、HashiCorp Vault 等），以便部署软件或使用云服务。 在工作流程可以访问这些资源之前，它将向云提供商提供凭据（如密码或令牌）。 这些凭据通常作为机密存储在其中 GitHub，工作流每次运行时都会将此机密呈现给云提供商。

但是，使用硬编码的机密要求你在云提供商中创建凭据，然后将其复制到 GitHub 作为机密。

与支持 OIDC 的云提供商建立信任连接后，可以将工作流配置为直接从云提供商请求短期访问令牌。

## 使用 OIDC 的好处

通过更新工作流程以使用 OIDC 令牌，您可以采用以下良好的安全实践：

* **无云机密：** 你无需将云凭据复制为长期存在的 GitHub 机密。 相反，您可以在云提供商上配置 OIDC 信任，然后更新您的工作流程，通过 OIDC 向云提供商请求短期访问令牌。
* **身份验证和授权管理：** 可以更精细地控制工作流使用凭据的方式，使用云提供商的身份验证 (authN) 和授权 (authZ) 工具来控制对云资源的访问。
* **轮换凭据：** 借助 OIDC，云提供商会颁发一个仅对单个作业有效的短期访问令牌，然后自动过期。

## OIDC 如何集成与 GitHub Actions

下图概述了 GitHub 的 OIDC 提供程序如何与你的工作流和云提供程序集成：

![显示云提供商如何通过访问令牌和 JSON Web 令牌云角色 ID 与 GitHub Actions 集成的示意图。](/assets/images/help/actions/oidc-architecture.png)

1. 在云提供商中建立 OIDC 信任关系，允许特定 GitHub 工作流代表定义的云角色请求云访问令牌。
2. 每次作业运行时， GitHub的 OIDC 提供程序都会自动生成一个 OIDC 令牌。 此令牌包含多个声明，用于建立有关尝试进行身份验证的特定工作流程的经安全强化且可验证的身份。
3. 工作流作业中的步骤或操作可从 GitHub 的 OIDC 提供程序请求令牌，然后可将该令牌提交给云提供程序，作为工作流身份的证明。
4. 云提供商成功验证令牌中提供的声明后，将提供仅在作业期间可用的短期云访问令牌。

## 了解 OIDC 令牌

每个作业都从 GitHubOIDC 提供程序请求一个 OIDC 令牌，该令牌使用自动生成的 JSON Web 令牌（JWT）进行响应，该令牌对于生成的每个工作流作业都是唯一的。 当作业运行时，OIDC 令牌将呈现给云提供商。 要验证令牌，云提供商会检查 OIDC 令牌的主题和其他声明是否与云角色的 OIDC 信任定义上预配置的条件匹配。

以下示例 OIDC 令牌使用主题 (`sub`)，该主题引用 `prod` 存储库中名为 `octo-org/octo-repo` 的作业环境。

```yaml
{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "example-thumbprint",
  "kid": "example-key-id"
}
{
  "jti": "example-id",
  "sub": "repo:octo-org/octo-repo:environment:prod",
  "environment": "prod",
  "aud": "https://HOSTNAME/octo-org",
  "ref": "refs/heads/main",
  "sha": "example-sha",
  "repository": "octo-org/octo-repo",
  "repository_owner": "octo-org",
  "actor_id": "12",
  "repository_visibility": "private",
  "repository_id": "74",
  "repository_owner_id": "65",
  "run_id": "example-run-id",
  "run_number": "10",
  "run_attempt": "2",
  "runner_environment": "github-hosted",
  "actor": "octocat",
  "workflow": "example-workflow",
  "head_ref": "",
  "base_ref": "",
  "event_name": "workflow_dispatch",
  "enterprise": "avocado-corp",
  "enterprise_id": "2",
  "ref_type": "branch",
  "job_workflow_ref": "octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main",
  "iss": "https://HOSTNAME/_services/token",
  "nbf": 1632492967,
  "exp": 1632493867,
  "iat": 1632493567
}
```

> \[!NOTE]
> `sub`此示例中的声明使用以前的格式。 在 2026 年 7 月 15 日之后创建的存储库使用不可变的默认主题格式，其中包括所有者和存储库 ID（不可用）。GitHub Enterprise Server 有关详细信息，请参阅“[OpenID Connect 参考](/zh/enterprise-server@3.22/actions/reference/security/oidc#immutable-subject-claims)”。

## 使用 OIDC 对自定义操作进行身份验证

自定义操作通过 Actions 工具包中的 `getIDToken()` 方法或 `curl` 命令使用 OIDC 进行身份验证。

有关详细信息，请参阅“[OpenID Connect 参考](/zh/enterprise-server@3.22/actions/reference/security/oidc#methods-for-requesting-the-oidc-token)”。

## 更新 OIDC 的工作流程

GitHub Actions 工作流可以使用 OIDC 令牌而不是机密向云提供商进行身份验证。 许多主流云提供商都提供官方登录操作，可简化在工作流中使用 OIDC 的流程。 有关针对特定云提供商更新工作流的详细信息，请参阅 [安全强化您的部署](/zh/enterprise-server@3.22/actions/how-tos/secure-your-work/security-harden-deployments)。

## 对 OIDC 的支持 Dependabot

Dependabot 可以使用 OIDC 通过专用注册表进行身份验证，而无需将长期凭据存储为存储库机密。 使用基于 OIDC 的身份验证，Dependabot 更新任务可以从您的云身份提供商动态获取短时效的凭据。

Dependabot 当注册表托管在 AWS CodeArtifact、Azure DevOps Artifacts 或 JFrog Artifactory 上时，支持对使用 `username` 和 `password` 身份验证的任何注册表类型的 OIDC 身份验证。

OIDC 身份验证 Dependabot 的优点包括：

* **增强的安全性：** 消除存储库中的静态长期凭据。
* **更简单的管理：** 启用对专用注册表的安全、符合策略的访问。
* **避免速率限制：** 动态凭据有助于避免达到与静态令牌关联的速率限制。

有关详细信息，请参阅“[为 Dependabot 配置对专用注册表的访问权限](/zh/enterprise-server@3.22/code-security/how-tos/secure-your-supply-chain/manage-your-dependency-security/configure-access-to-private-registries#using-oidc-for-authentication)”。

## 后续步骤

有关配置 OIDC 的详细信息，请参阅 [安全强化您的部署](/zh/enterprise-server@3.22/actions/how-tos/secure-your-work/security-harden-deployments)。

有关 OIDC 的参考信息，请参阅 [OpenID Connect 参考](/zh/enterprise-server@3.22/actions/reference/security/oidc)。