在本地开发时如何使用@azure/identity 和来自'az login' 的DefaultCredentials 而不是服务帐户?

How to use @azure/identity with DefaultCredentials from 'az login' instead of service account when developing locally?

不确定这是否已经以某种方式成为可能,或者有一个不同的 'flow' 是预期的并且是有意义的,我还没有发现。

我们在应用程序和开发环境中使用@azure/keyvault-secrets + @azure/identity 来access/manage 我们所有的secrets/keys。

在生产环境中,这很容易,因为我们可以直接将服务帐户与应用程序服务相关联,或者只创建一个服务帐户并将其设置在环境变量中,然后永远不要碰它。

虽然在本地,出于开发目的,必须为我们正在开发的应用程序获取秘密 keys/configuration 并不理想,但能够使用来自 azure cli 的帐户凭据是理想的根据开发应用程序的开发人员以及他们有权访问的内容来检索机密,以便我们可以在他们的帐户上强制执行 mfa 并仅为他们的用户帐户管理对密钥的访问等等。

@azure/identity 模块目前是否支持这种行为?如果没有,除了为开发人员中的每个应用程序配置服务帐户之外,是否有针对此用例的推荐行为。环境?

据我了解,您想使用 azure cli creds 获取 Azure key vault secret。如果是这样,您可以使用 sdk @azure/ms-rest-nodeauth。萌详情请参考https://github.com/Azure/azure-sdk-for-node/issues/2284。详细步骤如下。

  1. 使用 VS 代码创建保护
npm init -y
npm install @azure/ms-rest-nodeauth
npm install @azure/keyvault
  1. 使用 Azure CLI 登录 Azure
az login
  1. 代码
var azure = require('@azure/ms-rest-nodeauth')
var keyvault = require('@azure/keyvault')

async function main() {
    const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })


        const client = new keyvault.KeyVaultClient(creds)
        const secret = await client.getSecret('https://testkey08.vault.azure.net', 'test', '517cc458b7464c379d1d3e85bd2a5c94')
         console.log(secret)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });


更新

根据我的测试,如果使用sdk @azure/keyvault-secrets获取key vault secret,请参考以下代码:

var azure = require('@azure/ms-rest-nodeauth')
var keyvault = require('@azure/keyvault-secrets')

async function main() {
    const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })



        const client = new keyvault.SecretClient('https://<your key vault name>.vault.azure.net',creds)
        const secret = await client.getSecret('your secret name')
         console.log(secret)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });

此外,根据我的测试和研究,如果我们使用 sdk @azure/keyvault-secrets@azure/keyvault-secrets,我们无法使用 azure cli 的帐户凭据来取回秘密。更多详情,请参考document

所以如果我们想在本地开发你的应用程序,我建议你创建一个服务主体来获取密钥库。详细步骤如下

  1. 创建 sp
az ad sp create-for-rbac -n <your-application-name> --skip-assignment
az keyvault set-policy --name <your-key-vault-name> --spn $AZURE_CLIENT_ID --secret-permissions backup delete get list purge recover restore set

  1. 创建 .env 文件
AZURE_TENANT_ID=<tenant id>
AZURE_CLIENT_ID=<app id>
AZURE_CLIENT_SECRET=<password>
  1. 代码
var keyvault = require('@azure/keyvault-secrets')
var azure1 = require('@azure/identity')
const dotenv = require('dotenv');
dotenv.config();
async function main() {
    //const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })


        // console.log("way1")
        // const client = new keyvault.SecretClient('https://testkey08.vault.azure.net',creds)
        // const secret = await client.getSecret('test')
        // //const secret = await client.getSecret('https://testkey08.vault.azure.net', 'test', '517cc458b7464c379d1d3e85bd2a5c94')
        //  console.log(secret)
         console.log("-----------------------")
         console.log("way2")
         const creds1 = new  azure1.DefaultAzureCredential()


          const client1 = new keyvault.SecretClient('https://testkey08.vault.azure.net',creds1)
          const secret1 = await client1.getSecret('test')
          console.log(secret1)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });