-
Notifications
You must be signed in to change notification settings - Fork 326
Description
Last month PyPI added support for "Trusted Publishing": https://blog.pypi.org/posts/2023-04-20-introducing-trusted-publishers/. This uses an credential exchange flow to swap OIDC credentials with a short-lived PyPI API token, removing the need to maintain long-lived credentials/secrets. (More technical details on the exchange are here: https://docs.pypi.org/trusted-publishers/internals/)
We were able to do launch this without modifying twine directly because we instead updated https://github.com/pypa/gh-action-pypi-publish to do the token exchange prior to invoking twine upload.
That said, we're actively working on expanding support to other providers for which we don't have "canonical" workflows (such as pypi/warehouse#13551, pypi/warehouse#13575, and pypi/warehouse#13888).
For these providers (as well as for GitHub users who prefer not to use the pypi-publish GitHub action for whatever reason) it would be preferable to have twine be able to support the OIDC/API token exchange directly.
This would ideally include:
- detecting whether an "ambient" OIDC token is available at the time
twine uploadis run (this can be handled by https://pypi.org/p/id, sotwinedoesn't need to understand how to do this for N different providers) - verifying that the OIDC token is acceptable for use with PyPI (this just requires that the
audclaim of the token is set to the audience of the index thattwineis attempting to upload to) - exchanging the OIDC token for a PyPI API token (this is essentially the same as what the
pypi-publishworkflow does here: https://github.com/pypa/gh-action-pypi-publish/blob/110f54a3871763056757c3e203635d4c5711439f/oidc-exchange.py)
The alternative to twine supporting this directly is that the end user has to perform a fairly manual token exchange themselves directly (https://docs.pypi.org/trusted-publishers/using-a-publisher/#the-manual-way) which would be pretty bad UX overall.
Opening this issue to make sure maintainers are on board with the general idea before any implementation is started, please let me know if you have any thoughts.
(cc @woodruffw)