繁体   English   中英

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

[英]Azure KeyVault: get_secret() - Python TypeError: string indices must be integers

我一直在尝试使用以下 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

我们已经在本地环境中测试了相同的代码(本地机器运行的是 "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)以获取秘密值,这是不可能的,因为密钥库名称本身是一个名称,并且它不包含任何值,而秘密紧随其后(键,值)对。

我通过使用以下方式来解决这个问题:

secrets = _sc.list_properties_of_secrets()

然后我可以循环每个secretsecrets 然后我将一个名为key的变量设置为secret.name 使用此key ,我从保险库中获取值:

secrets = _sc.list_properties_of_secrets()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM