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 提供多个凭据,它们将按顺序评估,直到第一个匹配发生。如果找不到匹配项,则不会注入凭据。还可以使用自定义 授权插件 直接从您自己的秘密管理器检索凭据。

必须注意,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}}"
        }
    ]
}

注意

最佳实践

  • 避免在 conanfile.py recipe 中使用编码了令牌或用户/密码认证的 URL。这些 URL 很容易泄露到日志中,并且在凭据更改时更难修复(这也适用于 Git 仓库 URL 和克隆,最好使用其他 Git 认证机制,如 ssh-keys)