source_credentials.json

警告

此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。

当一个 conanfile.py recipe 从其他服务器下载一些资源时,使用 download()get() 辅助函数,例如

def source(self):
    # Immutable source .zip
    download(self, f"https://server/that/need/credentials/files/tarballname-{self.version}.zip", "downloaded.zip")
    # Also the ``get()`` function, as it internally calls ``download()``

这些下载通常对于互联网上的开源第三方库是匿名的,但也有可能某些专有代码在私有组织或由供应商提供时需要某种身份验证。

为此,可以在 Conan 缓存中提供 source_credentials.json 文件。该文件具有以下格式,其中每个 credentials 条目都应具有一个 url,该 URL 定义了应与 recipe URL 匹配的 URL。如果 recipe URL 以凭据文件中的给定 URL 开头,则将注入凭据。如果文件为多个 URL 提供多个凭据,则将按顺序评估它们,直到发生第一次匹配。如果没有找到匹配项,则不会注入任何凭据。也可以使用自定义 auth 插件 直接从您自己的密钥管理器检索凭据。

需要注意的是,source_credentials 仅适用于使用 tools.files download()get() 辅助函数下载的文件,但它不会用于其他情况。要为 Conan 仓库提供凭据,应使用 credentials.json 文件,请参阅 credentials.json

{
    "credentials": [
        {
            "url": "https://server/that/need/credentials",
            "token": "mytoken"
        }
    ]
}

使用 token 字段,将添加一个 Authorization = Bearer {token} 头。这是首选的身份验证方式,因为它通常比使用用户名/密码更安全。

如果出于某种原因需要使用用户名/密码进行 HTTP-Basic 身份验证,可以使用 userpassword 字段提供。

{
    "credentials": [
        {
            "url": "https://server/that/need/credentials",
            "user": "myuser",
            "password": "mypassword"
        }
    ]
}

作为一般规则,强烈建议不要将密码等密钥硬编码到文件中。为了避免这种情况,source_credentials.json 文件始终被渲染为 jinja 模板,因此它可以执行诸如获取环境变量 os.getenv() 之类的操作,从而允许在系统或 CI 级别配置密钥。

{% set mytk = os.getenv('mytoken') %}
{
    "credentials": [
        {
            "url": "https://server/that/need/credentials",
            "token": "{{mytk}}"
        }
    ]
}

在某些特殊情况下,服务器可能需要一些特定的自定义标头。您也可以使用 headers 字典指定它们。

{
    "credentials": [
        {
            "url": "https://server/that/need/credentials",
            "token": "mytoken",
            "headers": {"my-header-1": "my-value-1", "my-header-2": "my-value-2"}
        }
    ]
}

注意

最佳实践

  • 避免在 conanfile.py recipe 中使用将令牌或用户名/密码身份验证编码到 URL 中的 URL。这些 URL 很容易泄露到日志中,并且在凭据更改的情况下可能更难以修复(这也适用于 Git 仓库的 URL 和克隆,最好使用其他 Git 身份验证机制,如 ssh 密钥)