[英]TypeError: string indices must be integers - while trying to read secret
[英]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()
然后我可以循环每个secret
中secrets
。 然后我将一个名为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.