Skip to main content

Configuration d’OpenID Connect dans PyPl

Utilisez OpenID Connect dans vos flux de travail pour vous authentifier auprès de PyPl.

Vue d’ensemble

OpenID Connect (OIDC) permet à vos flux de travail GitHub Actions de s’authentifier auprès d’un PyPI pour publication de packages Python.

Ce guide donne une vue d’ensemble de la configuration de PyPI pour approuver l’OIDC de GitHub comme identité fédérée et montre comment utiliser cette configuration dans l’action pypa/gh-action-pypi-publish pour publier des packages sur PyPI (ou d’autres référentiels de packages Python) sans gestion manuelle des jetons d’API.

Prérequis

  • Pour en savoir plus sur les concepts de base décrivant la façon dont GitHub utilise OIDC (OpenID Connect) ainsi que sur son architecture et ses avantages, consultez « À propos du renforcement de la sécurité avec OpenID Connect ».

  • Avant de continuer, vous devez planifier votre stratégie de sécurité pour veiller à ce que les jetons d’accès soient uniquement alloués de manière prévisible. Pour contrôler la façon dont votre fournisseur de cloud émet des jetons d’accès, vous devez définir au moins une condition, afin que les dépôts non approuvés ne puissent pas demander de jetons d’accès à vos ressources cloud. Pour plus d’informations, consultez « À propos du renforcement de la sécurité avec OpenID Connect ».

  • Si vous suivez ce guide sur GHE.com, sachez que vous devez remplacer certaines valeurs dans la documentation suivante. Consultez « À propos du renforcement de la sécurité avec OpenID Connect ».

Ajout du fournisseur d’identité sur PyPl

Pour utiliser OIDC avec PyPI, ajoutez une configuration d’approbation qui lie chaque projet sur PyPI à chaque combinaison de référentiels et de flux de travail autorisée à le publier.

  1. Connectez-vous à PyPI et accédez aux paramètres de publication approuvés pour le projet que vous voulez configurer. Pour un projet nommé myproject, ce sera à https://pypi.org/manage/project/myproject/settings/publishing/.

  2. Configurez une relation d’approbation entre le projet PyPI et un référentiel GitHub (et le flux de travail dans le référentiel). Par exemple, si votre référentiel GitHub se trouve à myorg/myproject et votre flux de travail de mise en production est défini dans release.yml avec un environnement de release, vous devez utiliser les paramètres suivants pour votre éditeur approuvé sur PyPI.

    Remarque : entrez avec précaution ces valeurs. Donner à l’utilisateur, au référentiel ou au flux de travail incorrect la possibilité de publier sur votre projet PyPI équivaut à partager un jeton d’API.

    • Propriétaire : myorg
    • Nom du référentiel : myproject
    • Nom du flux de travail : release.yml
    • (Facultatif) un nom d’environnement GitHub Actions : release

Mise à jour de votre workflow GitHub Actions

Quand votre éditeur approuvé est inscrit sur PyPI, vous pouvez mettre à jour votre flux de travail de mise en production pour utiliser la publication approuvée.

Remarque : lorsque des environnements sont utilisés dans des workflows ou dans des stratégies OIDC, nous vous recommandons d’ajouter des règles de protection à l’environnement pour plus de sécurité. Par exemple, vous pouvez configurer des règles de déploiement sur un environnement pour restreindre les branches et balises pouvant être déployées dans l’environnement ou accéder aux secrets d’environnement. Pour plus d’informations, consultez « Gestion des environnements pour le déploiement ».

L’action pypa/gh-action-pypi-publish a un support prédéfini pour l’édition approuvée, qui peut être activée en donnant l’autorisation id-token: write à la fonction qui la contient et en omettant username et password.

L’exemple suivant utilise l’action pypa/gh-action-pypi-publish pour échanger un jeton OIDC contre un jeton d’API PyPI, qui est ensuite utilisé pour télécharger les distributions de mise en production d’un package sur PyPI.

YAML
jobs:
  release-build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - 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@v4
        with:
          name: release-dists
          path: dist/

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