Skip to main content

Configurar OpenID Connect en PyPI

Utiliza OpenID Connect dentro de tus flujos de trabajo para autenticarte con PyPI.

Información general

OpenID Connect (OIDC) permite que tus flujos de trabajo GitHub Actions se autentiquen con PyPI para publicar paquetes de Python.

En esta guía se proporciona información general sobre cómo configurar PyPI para OIDC GitHub's de confianza como identidad federada y se muestra cómo usar esta configuración en la acción pypa/gh-action-pypi-publish para publicar paquetes en PyPI (u otros repositorios de paquetes de Python) sin ninguna administración manual de tokens de API.

Requisitos previos

  • Para conocer los conceptos básicos de cómo GitHub usa OpenID Connect (OIDC) y su arquitectura y ventajas, consulta "Acerca del fortalecimiento de seguridad con OpenID Connect".

  • Antes de proceder, debes planear tu estrategia de seguridad para garantizar que los tokens de acceso solo se asignen de forma predecible. Para controlar la forma en que el proveedor de servicios en la nube emite tokens de acceso, tendrá que definir al menos una condición, para que los repositorios no confiables no puedan solicitar tokens de acceso para los recursos en la nube. Para obtener más información, vea «Acerca del fortalecimiento de seguridad con OpenID Connect».

Agregar el proveedor de identidades a AWS

Para usar OIDC con PyPI, agrega una configuración de confianza que vincule cada proyecto de PyPI a cada repositorio y combinación de flujo de trabajo que tenga permiso para publicar para él.

  1. Inicia sesión en PyPI y vaya a la configuración de publicación de confianza del proyecto que deseas configurar. En el caso de un proyecto denominado myproject, se encontrará en https://pypi.org/manage/project/myproject/settings/publishing/.

  2. Configura una relación de confianza entre el proyecto PyPI y un repositorio GitHub (y flujo de trabajo dentro del repositorio). Por ejemplo, si tu repositorio GitHub está en myorg/myproject y el flujo de trabajo de versión se define en release.yml con un entorno de release, debes usar la siguiente configuración para el editor de confianza en PyPI.

    Nota: Escribe estos valores cuidadosamente. Proporcionar al usuario, repositorio o flujo de trabajo incorrectos la capacidad de publicar en el proyecto de PyPI es equivalente a compartir un token de API.

    • Propietario: myorg
    • Nombre del repositorio: myproject
    • Nombre del flujo de trabajo: release.yml
    • (Opcionalmente) un nombre de entorno GitHub Actions: release

Actualizar tu flujo de trabajo de GitHub Actions

Una vez registrado el editor de confianza en PyPI, puedes actualizar el flujo de trabajo de lanzamiento para usar la publicación de confianza.

Nota: Cuando los entornos se usan en flujos de trabajo o en directivas de OIDC, se recomienda agregar reglas de protección al entorno para mayor seguridad. Por ejemplo, puedes configurar reglas de implementación en un entorno para restringir qué ramas y etiquetas se pueden implementar en el entorno o acceder a secretos del entorno. Para obtener más información, vea «Administrar entornos para la implementación».

La acción pypa/gh-action-pypi-publish tiene compatibilidad integrada con la publicación de confianza, que se puede habilitar al conceder a su trabajo contenedor el permiso id-token: write y omitir username y password.

En el ejemplo siguiente se usa la acción pypa/gh-action-pypi-publish para intercambiar un token OIDC para un token de API de PyPI, que luego se usa para liberar las distribuciones de versión de un paquete en 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