python - 无法使用 python 访问 azure key Vault secret

标签 python azure oauth azure-active-directory azure-keyvault

我已经能够通过外部 Web 应用程序使用 oauth Rest api 访问 azure key Vault,但由于某种原因,我无法从 key 中检索 secret 。经过长时间的研究,我发现可以使用 powershell 和 c# 来做到这一点,但仍然没有找到任何使用 python 的解决方案。 有人知道 python 是否可行,或者有没有办法模拟 powershell 的功能? 这是检索 secret 的代码:

def getSecret(vault_name, secret_name, secret_version = ''):
    #Get acess token to azure account
    data = { "grant_type" : "client_credentials", 
            "client_id" : 'appidxx', 
            "client_secret" : 'appsecretxx', 
            "resource" : "https://vault.azure.net"
        }
    headers = { "Content-Type" : "application/x-www-form-urlencoded" }
    r = requests.post("https://login.windows.net/{}/oauth2/token".format('my tenant id'), data=data, headers=headers)
    access_token = r.json()['access_token']
    #Get secret from KeyVault
    headers = {"Authorization":"Bearer {}".format(access_token) }
    r = requests.get('https://{}.vault.azure.net/secrets/{}/{}?api-version=2015-06-01'.format(vault_name, secret_name, secret_version), headers=headers)
    result = r.json()
    if 'value' in result.keys():
        return result["value"]
    else: 
        return 'Secret Not Found'

def searchSecret(secret_name, secret_version = ''):
subscription_id = 'subscription id'    
credentials = ServicePrincipalCredentials(
        client_id= 'appidxx',
        secret= 'appsecretxx',
        tenant= 'tenantidxx'
    )

    kvm_client = KeyVaultManagementClient(credentials,  subscription_id )
    for vault in kvm_client.vaults.list():
        #return when secret found in vault
        secret = getSecret(vault.name, secret_name, secret_version = '')
        if (secret != 'Secret Not Found'):
            return secret
    return 'Secret Not Found'

此外,我已在 azure 门户中注册了我的应用程序,并授予了对我的 key 和 secret 的权限,但是我注意到,当通过访问策略授予对我的应用程序的访问权限时,“授权应用程序”选项被锁定,我无法添加我的应用程序,这可能是我的问题的根本原因? screenshot

最佳答案

如果您想使用 Azure SDK 更轻松地访问 secret ,可以使用 Python 中的 Key Vault 替代 azure-keyvault 的新软件包:

azure-identity也是应该与这些一起用于身份验证的包。

有关使用 secret 库的文档可以在 azure-sdk-for-python GitHub repository 上找到。 ,这是一个用于检索 secret 的示例:

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
from azure.mgmt.keyvault import KeyVaultManagementClient

credential = DefaultAzureCredential()
subscription_id = "subscription id"

def getSecret(vault_url, secret_name, secret_version=None):
    client = SecretClient(vault_url, credential)
    # list the secrets in the vault
    secret_properties = client.list_properties_of_secrets()
    for secret_property in secret_properties:
        if secret_property.name == secret_name:
            # get secret from Key Vault
            return client.get_secret(secret_name, secret_version)
    return "Secret Not Found"

def searchSecret(secret_name, secret_version=None):
    kvm_client = KeyVaultManagementClient(credential, subscription_id)
    for vault in kvm_client.vaults.list():
        # return when secret found in vault
        secret = getSecret(vault.properties.vault_uri, secret_name, secret_version)
        if secret != "Secret Not Found":
            return secret
    return "Secret Not Found"

您可以通过设置与 client_idsecret 对应的环境变量来提供用于 ServicePrincipalCredentials 的相同凭据租户:

export AZURE_CLIENT_ID="appidxx"
export AZURE_CLIENT_SECRET="appsecretxx"
export AZURE_TENANT_ID="tenantidxx"

(我使用 Python 处理 Azure SDK)

关于python - 无法使用 python 访问 azure key Vault secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452977/

相关文章:

python - 如何根据 ReferenceProperty 的属性查询记录? (应用引擎上的 Django)

python - 将多页pdf连接成单页pdf

python - 使用genfromtxt读入不同列长度的数据

azure - 从 Azure Devops 中的中央 GIT 存储库管理 API 管理?

python - __next__ 和 __str__ 是否由等效的 next 和 str 函数在内部调用?

azure - 批量复制/删除容器中的一些blob

azure - 如何将现有的 Block Blob 转换为 PageBlob

c# - 使用 C# 的 REST API 身份验证 (OAuth 1.0)

C# Google Drive APIv3 上传文件

oauth - 在passport.js 中为OAuth 策略动态指定重定向URL 的最佳方法是什么?