{"meta":{"title":"在 PyPI 中配置 OpenID Connect","intro":"在工作流中使用 OpenID Connect 来完成 PyPI 身份验证。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/how-tos","title":"操作方法"},{"href":"/zh/actions/how-tos/secure-your-work","title":"保护工作安全"},{"href":"/zh/actions/how-tos/secure-your-work/security-harden-deployments","title":"安全加固部署"},{"href":"/zh/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-pypi","title":"PyPI 中的 OIDC"}],"documentType":"article"},"body":"# 在 PyPI 中配置 OpenID Connect\n\n在工作流中使用 OpenID Connect 来完成 PyPI 身份验证。\n\n## 概述\n\n借助 OpenID Connect (OIDC)，GitHub Actions 工作流将可以使用 [PyPI](https://pypi.org) 完成身份验证，从而发布 Python 包。\n\n本指南概述了如何将 PyPI 配置为信任 GitHub 的 OIDC，以作为联合标识，并演示了如何在 [`pypa/gh-action-pypi-publish`](https://github.com/marketplace/actions/pypi-publish) 操作中使用此配置，将包发布到 PyPI（或其他 Python 包存储库），而无需进行任何手动 API 令牌管理。\n\n## Prerequisites\n\n* 若要了解使用 OpenID Connect（OIDC）及其体系结构和优势的基本概念 GitHub ，请参阅 [OpenID Connect](/zh/actions/concepts/security/openid-connect)。\n\n* 在继续之前，必须规划安全策略，以确保仅以可预测的方式分配访问令牌。 要控制云提供商颁发访问令牌的方式，必须至少定义一个条件，以便不受信任的存储库无法为云资源请求访问令牌。 有关详细信息，请参阅 [OpenID Connect 参考](/zh/actions/reference/security/oidc#oidc-claims-used-to-define-trust-conditions-on-cloud-roles)。\n\n## 将标识提供者添加到 PyPI\n\n要将 OIDC 与 PyPI 配合使用，请添加信任配置，以将 PyPI 上的每个项目关联到允许为其发布的每个存储库和工作流组合。\n\n1. 登录 PyPI 并导航到要配置的项目的受信任发布设置。 对于名称为 `myproject` 的项目，这将位于 `https://pypi.org/manage/project/myproject/settings/publishing/`。\n\n2. 配置 PyPI 项目与 GitHub 存储库（以及存储库内部的工作流）之间的信任关系。 例如，假设 GitHub 存储库位于 `myorg/myproject` 中，而发布工作流是在 `release.yml` 中定义的，并且使用 `release` 环境，则应为 PyPI 上的受信任发布者使用以下设置。\n\n   > \\[!NOTE]\n   > 输入这些值时应小心。 让不正确的用户、存储库或工作流能够发布到 PyPI 项目，等同于共享 API 令牌。\n\n   * 所有者：`myorg`\n   * 存储库名称：`myproject`\n   * 工作流名称：`release.yml`\n   * （可选）GitHub Actions 环境名称：`release`\n\n## 更新 GitHub Actions 工作流程\n\n在 PyPI 上注册受信任的发布者后，即可以更新发布工作流，以便使用受信任的发布。\n\n> \\[!NOTE]\n> 在工作流或 OIDC 策略中使用环境时，建议将保护规则添加到环境中以提高安全性。 例如，可以在环境中配置部署规则，以限制可以部署到环境或访问环境机密的分支和标记。 有关详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。\n\n[\n`pypa/gh-action-pypi-publish`\n](https://github.com/marketplace/actions/pypi-publish) 操作提供了对受信任发布的内置支持，可通过向包含作业授予 `id-token: write` 权限，并且忽略 `username` 和 `password`，从而实现这种支持。\n\n以下示例使用 `pypa/gh-action-pypi-publish` 操作来用 OIDC 令牌交换 PyPI API 令牌，然后使用后者将包的发布分发上传至 PyPI。\n\n```yaml copy\n# 此工作流使用未经 GitHub 认证的操作。\n# 它们由第三方提供，并受\n# 单独的服务条款、隐私政策和支持\n# 文档。\njobs:\n  release-build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n\n      - uses: actions/setup-python@v5\n        with:\n          python-version: \"3.x\"\n\n      - name: build release distributions\n        run: |\n          # NOTE: put your own distribution build steps here.\n          python -m pip install build\n          python -m build\n\n      - name: upload windows dists\n        uses: actions/upload-artifact@v4\n        with:\n          name: release-dists\n          path: dist/\n\n  pypi-publish:\n    runs-on: ubuntu-latest\n    needs:\n      - release-build\n    permissions:\n      id-token: write\n\n    steps:\n      - name: Retrieve release distributions\n        uses: actions/download-artifact@v5\n        with:\n          name: release-dists\n          path: dist/\n\n      - name: Publish release distributions to PyPI\n        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f\n```"}