Azure KeyVault:get_secret() - Python TypeError:字符串索引必须是整数

Posted

技术标签:

【中文标题】Azure KeyVault:get_secret() - Python TypeError:字符串索引必须是整数【英文标题】:Azure KeyVault: get_secret() - Python TypeError: string indices must be integers 【发布时间】:2021-11-16 15:03:43 【问题描述】:

我一直在尝试使用以下 python 代码从本地 VM 获取 azure key vault 机密。不幸的是,我收到了类型错误。如果有人能解决这个问题,那将是一个很大的帮助:

from azure.identity import ClientSecretCredential
from azure.keyvault.secrets import SecretClient

SECRET_NAME = 'secretName'
TENANT_ID = 'client_id'
CLIENT_ID = 'tenant_id'
CLIENT_SECRET = 'secretValue'
KEYVAULT_NAME = 'keyVaultName'
KEYVAULT_URL = 'https://vault_url'

_credential = ClientSecretCredential(
    tenant_id = TENANT_ID,
    client_id = CLIENT_ID,
    client_secret = CLIENT_SECRET
    )

_sc = SecretClient(vault_url = KEYVAULT_URL, credential = _credential)
secret = _sc.get_secret(SECRET_NAME)

print(secret.name) 

我也试过 - print(_sc.get_secret(SECRET_NAME).value)。但它也显示相同的错误。

请在下面找到显示的错误:

Traceback (most recent call last):
  File "C:\Users\user\Desktop\trialSecret.py", line 37, in <module>
    print(_sc.get_secret(KEYVAULT_NAME).value)
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\core\tracing\decorator.py", line 83, in wrapper_use_tracer
    return func(*args, **kwargs)
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\keyvault\secrets\_client.py", line 67, in get_secret
    bundle = self._client.get_secret(
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\keyvault\secrets\_generated\_operations_mixin.py", line 1515, in get_secret
    return mixin_instance.get_secret(vault_base_url, secret_name, secret_version, **kwargs)
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\keyvault\secrets\_generated\v7_2\operations\_key_vault_client_operations.py", line 290, in get_secret
    map_error(status_code=response.status_code, response=response, error_map=error_map)
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\core\exceptions.py", line 104, in map_error
    error = error_type(response=response)
  File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\keyvault\secrets\_shared\exceptions.py", line 24, in _get_exception_for_key_vault_error
    message = "() ".format(body["error"]["code"], body["error"]["message"])  # type: Optional[str]
TypeError: string indices must be integers

【问题讨论】:

【参考方案1】:

我们已经在本地环境中测试了相同的代码(本地机器使用“azure.keyvault.secrets v 4.3.0”运行)。我们可以使用以下任一打印语句提取秘密值,如下所示

print(secret.value)
print(_sc.get_secret(SECRET_NAME).value)

"C:\Users\user\Desktop\trialSecret.py", line 37, in <module>
    print(_sc.get_secret(KEYVAULT_NAME).value)   File "C:\Users\user\AppData\Roaming\Python\Python39\site-packages\azure\core\tracing\decorator.py",
line 83, in wrapper_use_tracer
    return func(*args, **kwargs)

查看完整的堆栈跟踪,我们了解到您正在传递 print(_sc.get_secret(KEYVAULT_NAME).value) 以获取秘密值,这是不可能的,因为 keyvault 名称本身是一个名称并且它不包含任何值,而秘密遵循 (key, value) 对.

【讨论】:

【参考方案2】:

我通过以下方式处理这个有点不同:

secrets = _sc.list_properties_of_secrets()

然后我可以为secrets 中的每个secret 循环。然后我将一个名为key 的变量设置为secret.name。使用这个key,我从保险库中获得了价值:

secrets = _sc.list_properties_of_secrets()

for secret in secrets:
    key = secret.name
    val = _sc.get_secret(key).value

【讨论】:

以上是关于Azure KeyVault:get_secret() - Python TypeError:字符串索引必须是整数的主要内容,如果未能解决你的问题,请参考以下文章

从Xamarin表单访问Azure KeyVault

使用 Azure.Security.KeyVault.Secrets 的网络核心密钥保管库配置

Azure Keyvault 通过 ARM 添加 Function MSI

使用 KeyVault 和 Azure PowerShell 证书身份验证创建 Azure AD 应用程序

Azure 函数和 Azure KeyVault 通过服务端点进行通信

Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌