Skip to main content

PyPI での OpenID Connect の構成

ワークフロー内で OpenID Connect を使用して、PyPI で認証を行います。

概要

OpenID Connect (OIDC) を使用すると、開発中の GitHub Actions ワークフローが PyPI を使用して認証され、Python パッケージが公開されます。

このガイドでは、GitHubの OIDC をフェデレーション ID として信頼するように PyPI を構成する方法の概要と、手動の API トークン管理なしでパッケージを PyPI (またはその他のPython パッケージ リポジトリ) に発行するpypa/gh-action-pypi-publish アクションでこの構成を使用する方法について説明します。

前提条件

  • GitHub が OpenID Connect (OIDC) を使用する方法の基本的な概念とそのアーキテクチャと利点については、「OpenID Connect」を参照してください。

  • 先に進む前に、アクセス トークンが予測可能な方法でのみ割り当てられるようにセキュリティ戦略を計画する必要があります。 クラウド プロバイダーがアクセス トークンを発行する方法を制御するには、少なくとも 1 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする必要があります。 詳しくは、「OpenID Connect」をご覧ください。

PyPI への ID プロバイダーの追加

PyPI で OIDC を使用するには、PyPI 上の各プロジェクトを、発行が許可されている各リポジトリとワークフローの組み合わせにリンクする信頼構成を追加します。

  1. PyPI にサインインし、構成するプロジェクトの信頼された発行元の設定に移動します。 myproject という名前のプロジェクトの場合、これは https://pypi.org/manage/project/myproject/settings/publishing/ で次のようになります。

  2. PyPI プロジェクトと GitHub リポジトリ (およびリポジトリ内のワークフロー) の間の信頼関係を構成します。 たとえば、GitHub リポジトリが myorg/myproject で存在し、リリース ワークフローが release.yml の環境で release において定義されている場合は、PyPI の信頼できる発行元に対して次の設定を使用する必要があります。

    メモ

    これらの値は慎重に入力してください。 正しくないユーザー、リポジトリ、またはワークフローに PyPI プロジェクトに発行する機能を与えることは、API トークンを共有することと同じです。

    • 所有者: myorg
    • リポジトリ名: myproject
    • ワークフロー名: release.yml
    • (任意) GitHub Actions 環境名: release

GitHub Actions ワークフローを更新する

信頼された発行元が PyPI に登録されたら、信頼された発行を使用するようにリリース ワークフローを更新できます。

メモ

環境がワークフローまたは OIDC ポリシーで使われる場合は、セキュリティを強化するために環境に保護規則を追加することをお勧めします。 たとえば、環境のデプロイ規則を構成して、環境にデプロイできるブランチとタグを制限したり、環境シークレットにアクセスしたりできます。 詳しくは、「デプロイメント用の環境管理」をご覧ください。

この pypa/gh-action-pypi-publish アクションには、信頼された発行元のサポートが組み込まれています。その包含ジョブに id-token: write アクセス許可を付与し、usernamepassword を省略して有効にすることができます。

次の例では、pypa/gh-action-pypi-publish アクションを使用して、PYPI API トークンの OIDC トークンを交換します。このトークンを使用して、パッケージのリリースディストリビューションを PyPI にアップロードします。

YAML
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
jobs:
  release-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5

      - uses: actions/setup-python@v5
        with:
          python-version: "3.x"

      - name: build release distributions
        run: |
          # NOTE: put your own distribution build steps here.
          python -m pip install build
          python -m build

      - name: upload windows dists
        uses: actions/upload-artifact@v4
        with:
          name: release-dists
          path: dist/

  pypi-publish:
    runs-on: ubuntu-latest
    needs:
      - release-build
    permissions:
      id-token: write

    steps:
      - name: Retrieve release distributions
        uses: actions/download-artifact@v5
        with:
          name: release-dists
          path: dist/

      - name: Publish release distributions to PyPI
        uses: pypa/gh-action-pypi-publish@3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f