1

我正在尝试使用 python sdk 从 azure keyvault 检索和打印机密列表。

下面返回一个 paged.SecretItemPaged 对象:

from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials


az_client_id = '*****'
az_secret = '*****'
az_tenant = '*****'
credentials = None


def auth_callback(server, resource, scope):
    credentials = ServicePrincipalCredentials(
        client_id=az_client_id,
        secret=az_secret,
        tenant=az_tenant,
        resource="https://vault.azure.net"
    )
    token = credentials.token
    return token['token_type'], token['access_token']


client = KeyVaultClient(KeyVaultAuthentication(auth_callback))

secrets = client.get_secrets('https://thevault.vault.azure.net/')

print('vault secrets:\n{}'.format(secrets))

例如:

vault secrets:
<azure.keyvault.models.secret_item_paged.SecretItemPaged object at 0x7fc494c78b38>

我不确定如何处理这个对象。文档没有给我任何提示,除非我错过了一些东西。

4

1 回答 1

1

SecretItemPaged 页面是一个迭代器对象,这意味着您可以根据需要直接在 for 循环中使用它:

for item in secrets:
    print_my_secret(item)

或将其更改为列表

secrets_as_list = list(secrets)

这里没有魔法,它只是 Python 的迭代器协议。您还可以使用next, 并捕获StopIteration异常等。

查看该get_secrets方法,文档会告诉您它传达的对象类型

在此处输入图像描述

记录在SecretItem这里。

请注意,所有 SDK 对象都有一个as_dict方法,如果您更喜欢将其用作 dict,而不是具有属性的对象。

不要使用该current_page属性。如果您拥有的机密多于默认 JSON 可以处理的机密,则迭代器协议实现会隐藏您从 Azure 获取多个页面。这样做时list(secrets),您可能会获取 10 个页面并对 Azure 进行 10 次调用,您不知道,您不在乎 :)。current_page是最后一页的状态。它不是整个元素列表。

(我在这个 SDK 团队的 MS 工作)

编辑 2020 年 12 月

答案仍然有效,尽管该功能已移至azure-keyvault-secrets包中。因此,导入略有不同,请参阅从 KeyVault 读取机密的示例

于 2018-07-30T16:18:50.203 回答