身份验证¶
基本 HTTP 身份验证¶
pip 支持基于 HTTP 的基本身份验证凭据。这可以通过在 URL 中提供用户名(以及可选的密码)来实现。
https://username:password@pypi.company.com/simple
对于只需要单部分身份验证令牌的索引,请将令牌作为“用户名”提供,不要提供密码。
https://0123456789abcdef@pypi.company.com/simple
百分比编码特殊字符¶
在版本 10.0 中添加。
某些特殊字符在 URL 的凭据部分中是无效的。如果您的登录凭据的用户名或密码部分包含任何这些特殊字符,则必须对其进行百分比编码。例如,对于用户名为 user
且密码为 he//o
的用户,访问位于 pypi.company.com/simple
的仓库,带有凭据的 URL 将如下所示:
https://user:he%2F%2Fo@pypi.company.com/simple
netrc 支持¶
pip 支持从用户的 .netrc
文件加载凭据。如果 URL 中没有凭据,pip 将尝试从用户的 .netrc
文件中获取 URL 主机名的身份验证凭据。此行为来自对 requests 的底层使用,进而将其委托给Python 标准库的 netrc
模块。
注意
如netrc 的标准库文档中所述,.netrc
文件中只允许使用 ASCII 字符。密码中不允许使用空格和不可打印字符。
以下是一个示例 .netrc
,用于主机 example.com
,用户名为 daniel
,密码为 qwerty
machine example.com
login daniel
password qwerty
有关 .netrc
文件格式的更多信息,请参阅 GNU 的ftp
手册页。
Keyring 支持¶
pip 支持使用 keyring 库加载存储在您的 keyring 中的凭据,可以通过传递 --keyring-provider
并使用 auto
、disabled
、import
或 subprocess
的值来启用该库。默认值 auto
尊重 --no-input
并且在使用该选项时不会查询 keyring;否则,它会尝试 import
、subprocess
和 disabled
提供程序(按此顺序),并使用第一个有效的提供程序。
配置 pip 的 keyring 用法¶
由于 keyring 配置可能是系统范围的,因此配置其用法的更常见方法是使用配置。
另见
配置 描述了 pip 配置的工作原理。
$ pip config set --global global.keyring-provider subprocess
# A different user on the same system which has PYTHONPATH configured and and
# wanting to use keyring installed that way could then run
$ pip config set --user global.keyring-provider import
# For a specific virtual environment you might want to use disable it again
# because you will only be using PyPI and the private repo (and mirror)
# requires 2FA with a keycard and a pincode
$ pip config set --site global.index https://pypi.ac.cn/simple
$ pip config set --site global.keyring-provider disabled
# configuring it via environment variable is also possible
$ export PIP_KEYRING_PROVIDER=disabled
使用 keyring 的 Python 模块¶
将 keyring-provider
设置为 import
使 pip 通过其 Python 接口与 keyring
通信。
# install keyring from PyPI
$ pip install keyring --index-url https://pypi.ac.cn/simple
$ echo "your-password" | keyring set pypi.company.com your-username
$ pip install your-package --keyring-provider import --index-url https://pypi.company.com/
使用 keyring 作为命令行应用程序¶
将 keyring-provider
设置为 subprocess
使 pip 在 PATH
上查找和使用 keyring
命令。
对于此用例,URL 中必须包含用户名,因为 keyring
的命令行界面需要它。请参阅下面的示例或本页顶部的基本 HTTP 身份验证部分。
# Install keyring from PyPI using pipx, which we assume is installed properly
# you can also create a venv somewhere and add it to the PATH yourself instead
$ pipx install keyring --index-url https://pypi.ac.cn/simple
# For Azure DevOps, also install its keyring backend.
$ pipx inject keyring artifacts-keyring --index-url https://pypi.ac.cn/simple
# For Google Artifact Registry, also install and initialize its keyring backend.
$ pipx inject keyring keyrings.google-artifactregistry-auth --index-url https://pypi.ac.cn/simple
$ gcloud auth login
# Note that a username is required in the index URL.
$ pip install your-package --keyring-provider subprocess --index-url https://[email protected]/
前方高能¶
auto
提供程序非常保守,在使用 --no-input
时不会查询 keyring,因为 keyring 可能会需要用户交互,例如在控制台中提示用户。第三方工具经常为您调用 Pip,并且确实传递 --no-input
,因为它们的行为良好,并且没有多少信息可以使用。(Keyring 确实有一个 API 来请求一个不需要用户输入的后端。)但是您有更多关于您系统的信息!
您可以强制使用 keyring,方法是请求除 auto
(或 disabled
)以外的 keyring 提供程序。留下 import
和 subprocess
。您可以通过传递 --keyring-provider import
或以下方法之一来实现
# via config file, possibly with --user, --global or --site
$ pip config set global.keyring-provider subprocess
# or via environment variable
$ export PIP_KEYRING_PROVIDER=import
警告
执行此操作时要小心,因为这可能会导致 pipx 和 Pipenv 等工具似乎挂起。它们在运行 Pip 的子进程中隐藏输出时显示自己的进度指示器。在这种情况下,您将不知道 keyring 后端是否正在等待用户输入。
pip 非常保守,在使用 --no-input
时不会查询 keyring,因为 keyring 可能会需要用户交互,例如在控制台中提示用户。您可以通过传递 --force-keyring
或以下方法之一来强制使用 keyring。
# possibly with --user, --global or --site
$ pip config set global.force-keyring true
# or
$ export PIP_FORCE_KEYRING=1
警告
执行此操作时要小心,因为这可能会导致 pipx 和 Pipenv 等工具似乎挂起。它们在运行 Pip 的子进程中隐藏输出时显示自己的进度指示器。在这种情况下,您将不知道 keyring 后端是否正在等待用户输入。
请注意,keyring
(Python 包)需要与 pip 分开安装。如果您需要存储在 keyring 中的凭据来下载和安装 keyring,这可能会造成引导问题。
因此,希望使用 pip 的 keyring 支持的用户应该有一些机制来下载和安装 keyring。