# 选择最佳的访问凭据类型

## 概述

通常情况下，我们会选择最简单、直观的在应用程序源代码中硬编码访问凭据信息，这种方式并不便于访问凭据的管理和定期轮换，也不利于组织复杂的应用程序项目源代码。我们将该方式称之为默认访问凭据类型，其源代码形态通常为：

```python
access_credentials: credentials.Credentials = credentials.Credentials(
    secret_id = 'AKIDF3sMOAU1pOgkmrKHchX6TZQ1Mo1C5qa7',
    secret_key = 'b4JL8fwxkIgsKMXGi39yYt0ECxZw4wZf'
)
```

在下文中我们将向您介绍 Tencent Cloud SDK for Python 中所支持的其他访问凭据类型，您可以根据应用程序需求选择最佳的实践方式。

## 种类

### 环境凭据

环境凭据是指在特定应用程序运行环境中由环境变量所存储的访问凭据信息，Tencent Cloud SDK for Python 支持自动查找并使用有效的环境凭据作为客户端的访问凭据。

环境凭据类型由命名空间和模块 `tencent.cloud.auth.credentials` 中类 `EnvironmentalCredentials` 代表，该类的签名如下：

```python
class EnvironmentalCredentials(Credentials)
```

继承：`tencent.cloud.auth.credentials.Credentials` 类

当您选择并使用环境凭据时，Tencent Cloud SDK for Python 将尝试在当前运行环境的环境变量中查找默认名为 `TENCENTCLOUD_SECRETID` 和 `TENCENTCLOUD_SECRETKEY` 的环境变量值，对应访问凭据的 Secret ID 和 Secret Key 字段。

在下文中我们将通过 Python 代码片段向您演示如何使用环境凭据实例化无服务器云函数产品客户端：

```python
from tencent.cloud.auth import credentials

function_client: functions.Client = functions.Client(
    access_credentials = credentials.EnvironmentalCredentials()
)
```

{% hint style="info" %}
当您在 Tencent Cloud 无服务器云函数产品所运行的无服务器云函数代码中使用时，您可以为该无服务器云函数配置 运行角色。当无服务器云函数运行时将自动为其分配非持久临时访问凭据，该访问凭据将被 Tencent Cloud SDK for Python 视为环境凭据。
{% endhint %}

如果运行环境中存储访问凭据的环境变量名称与默认查找的环境变量名称不同，您可以手动指定：

```python
from tencent.cloud.auth import credentials

function_client: functions.Client = functions.Client(
    access_credentials = credentials.EnvironmentalCredentials(
        variable_name_of_secret_id = 'MY_SECRETID',
        variable_name_of_secret_key = 'MY_SECRETKEY'
    )
)
```

现在 Tencent Cloud SDK for Python 将尝试在当前运行环境的环境变量中查找名为 `MY_SECRETID` 和 `MY_SECRETKEY` 的环境变量值。

环境凭据支持隐式使用，这意味着若当前应用程序的运行环境符合环境凭据的所有默认行为，您将无需明确指定使用环境凭据：

```python
function_client: functions.Client = functions.Client()
```

{% hint style="warning" %}
请注意，如果当前应用程序运行环境中无法找到符合条件的环境凭据，将引发 **EnvironmentError** 异常。
{% endhint %}

### 文件凭据

没错，Tencent Cloud SDK for Python 不但支持环境凭据，也支持文件凭据。顾名思义，文件凭据是指将有效的访问凭据信息以 JSON 序列化文本的形式存储在文件上，Tencent Cloud SDK for Python 支持自动查找并使用有效的文件凭据作为客户端的访问凭据。

环境凭据类型由命名空间和模块 `tencent.cloud.auth.credentials` 中类 `FileCredentials` 代表，该类的签名如下：

```python
class FileCredentials(Credentials)
```

继承：`tencent.cloud.auth.credentials.Credentials` 类

当您选择并使用文件凭据时，Tencent Cloud SDK for Python 将尝试在当前运行目录下查找名为 `secret.json` 的 JSON 序列化文本文件，其文件内容形态如下：

```javascript
{
    "secretId": "AKIDF3sMOAU1pOgkmrKHchX6TZQ1Mo1C5qa7",
    "secretKey": "b4JL8fwxkIgsKMXGi39yYt0ECxZw4wZf"
}
```

其中，JSON 属性 `secretId` 和 `secretKey` 分别对应访问凭据的 Secret ID 和 Secret Key 字段。

在下文中我们将通过 Python 代码片段向您演示如何使用文件凭据实例化无服务器云函数产品客户端：

```javascript
from tencent.cloud.auth import credentials

function_client: functions.Client = functions.Client(
    access_credentials = credentials.FileCredentials('./secret.json')
)
```

请注意，文件凭据类型与环境凭据类型的实例化默认参数值不同，文件凭据类型实例化时必须明确指定包含访问凭据的 JSON 序列化文本文件的路径。

与环境凭据相同，文件凭据也支持隐式使用，这意味着若当前应用程序的文件环境符合文件凭据的所有默认行为，您将无需明确指定使用环境凭据，Tencent Cloud SDK for Python 将尝试在应用程序当前工作目录下查找名为 `secret.json` 的 JSON 序列化文本文件：

```python
function_client: functions.Client = functions.Client()
```

{% hint style="warning" %}
请注意，如果当前应用程序文件环境中无法找到符合条件的文件凭据，将引发 **FileNotFoundError** 异常；如果文件凭据中缺少必要的属性，将引发 **KeyError** 异常。
{% endhint %}

## 优先级

在上文中我们向您介绍了 Tencent Cloud SDK for Python 最新版本目前已支持的访问凭据类型，如果您决定隐式使用访问凭据类型，Tencent Cloud SDK for Python 将自动根据以下优先级查找：

1. 默认凭据
2. 文件凭据
3. 环境凭据

查找规则为若前一项访问凭据类型已找到，则终止其他类型的访问凭据查找。例如当前应用程序运行环境中同时满足文件凭据和环境凭据，根据访问凭据类型优先级，文件凭据将优先被使用。

## 建议

根据您的应用场景，Tencent Cloud SDK for Python 建议您选择的访问凭据类型如下：

| 应用场景类型  | 建议选择的访问凭据类型          | 参考级别 |
| ------- | -------------------- | ---- |
| 单一源文件   | 优先使用默认凭据，其次考虑使用文件凭据。 | 不适用  |
| 多源文件项目  | 优先使用文件凭据，其次考虑使用环境凭据。 | 不适用  |
| 无服务器云函数 | 优先使用文件凭据，其次考虑使用环境凭据。 | 不适用  |
| 开发环境    | 建议使用环境凭据，降低访问凭据泄漏风险。 | 高    |

{% hint style="info" %}
建议您根据应用程序所需要访问的 Tencent Cloud 产品资源分别创建适用于您 Tencent Cloud 账户的最小权限访问凭据。除非必要，否则访问凭据不应具有资源完全访问权限。
{% endhint %}
