source_credentials.json

Warning

This feature is experimental and subject to breaking changes. See the Conan stability section for more information.

When a conanfile.py recipe downloads some sources from other servers with the download() or the get() helpers like:

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()``

These downloads would be typically anonymous for open-source third party libraries in the internet, but it is also possible that some proprietary code in a private organization or provided by a vendor would require some kind of authentication.

For this purpose the source_credentials.json file can be provided in the Conan cache. This file has the following format, in which every credentials entry should have a url that defines the URL that should match the recipe one. If the recipe URL starts with the given one in the credentials files, then the credentials will be injected. If the file provides multiple credentials for multiple URLs, they will be evaluated in order until the first match happens. If no match is found, no credentials will be injected.

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

Using the token field, will add an Authorization = Bearer {token} header. This would be the preferred way of authentication, as it is typically more secure than using user/password.

If for some reason HTTP-Basic auth with user/password is necessary it can be provided with the user and password fields:

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

As a general rule, hardcoding secrets like passwords in files is strongly discouraged. To avoid it, the source_credentials.json file is always rendered as a jinja template, so it can do operations like getting environment variables os.getenv(), allowing the secrets to be configured at the system or CI level:

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

Note

Best practices

  • Avoid using URLs that encode tokens or user/password authentication in the conanfile.py recipes. These URLs can easily leak into logs, and can be more difficult to fix in case of credentials changes (this is also valid for Git repositories URLs and clones, better use other Git auth mechanisms like ssh-keys)