# 在 Octopus 部署中配置 OpenID Connect

在工作流中使用 OpenID Connect 通过 Octopus Deploy 进行身份验证。

## 概述

OpenID Connect（OIDC）允许您使用 [Octopus Deploy](https://octopus.com/) 对您的GitHub Actions工作流进行身份验证，以便推送包、创建发布或触发部署，而无需将 Octopus Deploy 的密码或 API 密钥作为长期的GitHub机密来存储。

本指南概述了如何配置 Octopus Deploy 以信任 GitHub 的 OIDC 作为联合标识，并包含一个工作流示例，该示例使用 [`octopusdeploy/login`](https://github.com/OctopusDeploy/login) 操作通过令牌向你的 Octopus Deploy 实例进行身份验证。

## 先决条件

* 若要了解使用 OpenID Connect（OIDC）及其体系结构和优势的基本概念 GitHub ，请参阅 [OpenID Connect](/zh/actions/concepts/security/openid-connect)。

* 在继续之前，必须规划安全策略，以确保仅以可预测的方式分配访问令牌。 要控制云提供商颁发访问令牌的方式，必须至少定义一个条件，以便不受信任的存储库无法为云资源请求访问令牌。 有关详细信息，请参阅 [OpenID Connect 参考](/zh/actions/reference/security/oidc#oidc-claims-used-to-define-trust-conditions-on-cloud-roles)。

## 将身份提供者添加到 Octopus Deploy

若要将 OIDC 与 Octopus Deploy 配合使用，请先在 GitHub Actions 与 Octopus Deploy 实例之间建立信任关系。 有关此过程的详细信息，请参阅 [Octopus 部署文档中将 OpenID Connect 与 Octopus API 配合使用](https://octopus.com/docs/octopus-rest-api/openid-connect) 。

1. 登录您的 Octopus Deploy 实例。
2. 创建或打开将通过令牌请求授予访问权限的服务帐户。
3. 配置新的 OIDC 标识，定义 GitHub Actions 工作流令牌请求将依据其进行验证的相关主题。

## 更新 GitHub Actions 工作流程

要更新 OIDC 的工作流程，您需要对 YAML 进行两项更改：

1. 为令牌添加权限设置。
2. 使用 [`OctopusDeploy/login`](https://github.com/OctopusDeploy/login) 操作以交换 OIDC 令牌 (JWT) 以获得云访问令牌。

> \[!NOTE]
> 在工作流或 OIDC 策略中使用环境时，建议将保护规则添加到环境中以提高安全性。 例如，可以在环境中配置部署规则，以限制可以部署到环境或访问环境机密的分支和标记。 有关详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。

### 添加权限设置

作业或工作流运行要求将 `permissions` 设置为 [`id-token: write`](/zh/actions/tutorials/authenticate-with-github_token#modifying-the-permissions-for-the-github_token)，以允许 GitHub 的 OIDC 提供程序为每次运行创建 JSON Web 令牌。

> \[!NOTE] 在工作流权限中设置 `id-token: write` 不会授予工作流修改或写入任何资源的权限。 这只会允许工作流为某个操作或步骤请求（提取）并使用（设置）OIDC 令牌。 然后，此令牌用于通过生存期较短的访问令牌向外部服务进行身份验证。

有关所需权限、配置示例和高级方案的详细信息，请参阅 [OpenID Connect 参考](/zh/actions/reference/security/oidc#workflow-permissions-for-the-requesting-the-oidc-token)。

### 请求访问令牌

[`OctopusDeploy/login`](https://github.com/OctopusDeploy/login)   操作从 GitHub OIDC 提供商接收 JWT，然后向你的 Octopus Server 实例请求访问令牌。 有关详细信息，请参阅 [`OctopusDeploy/login`](https://github.com/OctopusDeploy/login) 文档。

以下示例将 OIDC ID 令牌与 Octopus Deploy 实例交换，以接收访问令牌，然后可用于访问 Octopus 部署资源。 请务必根据您的情况，适当地替换`server`和`service_account_id`处的详细信息。

```yaml copy
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供，并受
# 单独的服务条款、隐私政策和支持
# 文档。

jobs:
  create_release_in_octopus:
    runs-on: ubuntu-latest
    name: Create a release in Octopus
    permissions:
      # You might need to add other permissions here like `contents: read` depending on what else your job needs to do
      id-token: write # This is required to obtain an ID token from GitHub Actions for the job
    steps:
      - name: Login to Octopus
        uses: OctopusDeploy/login@34b6dcc1e86fa373c14e6a28c5507d221e4de629 #v1.0.2
        with:
          server: https://my.octopus.app
          service_account_id: 5be4ac10-2679-4041-a8b0-7b05b445e19e

      - name: Create a release in Octopus
        uses: OctopusDeploy/create-release-action@fe13cc69c1c037cb7bb085981b152f5e35257e1f #v3.2.2
        with:
          space: Default
          project: My Octopus Project
```

## 延伸阅读

* [将 OpenID Connect 与可重用的工作流程结合使用](/zh/actions/how-tos/secure-your-work/security-harden-deployments/oidc-with-reusable-workflows)
* [自托管运行程序参考](/zh/actions/reference/runners/self-hosted-runners)