使用nodejs从Azure Keyvault获取Secret

MKN*_*MKN 1 azure node.js azure-active-directory azure-keyvault

我需要读取 Azure 活动目录中的用户列表。客户已经创建了一个 Graph API 应用程序,但他们不想共享该应用程序的客户端密钥,而是要求我们使用 Key Vault。如何从 node.js 应用程序访问密钥来检索用户列表?

我尝试了下面的方法,但出现错误,我不知道如何进行身份验证。

const { DefaultAzureCredential } = require("@azure/identity");
const { SecretClient } = require("@azure/keyvault-secrets");

const credential = new DefaultAzureCredential();

const vaultName = "lsm-keyvault";
const url = `https://${vaultName}.vault.azure.net`;

const client = new SecretClient(url, credential);

const secretName = "Demo";

async function main() {
  const result = await client.setSecret(secretName, "MySecretValue", {
    enabled: false
  });

  console.log(result)
}
Run Code Online (Sandbox Code Playgroud)

Joy*_*ang 7

好吧,如果您在本地运行代码,DefaultAzureCredential将自动使用环境变量。

因此,在您的情况下,您需要向 Azure AD 注册一个应用程序,并获取tenant idclient id(i.e. application id)client secret(i.e. application secret)、 设置环境变量AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID

对于您收到的 403 错误,我注意到您说It added as a compound entity,根据我的经验,您没有将与 AD 应用程序相关的正确服务主体正确添加到Access policieskeyvault 中。如果添加正确,它将显示为APPLICATION,而不是COMPOUND IDENTITY

所以添加的时候可以直接搜索client Id(i.e. application Id)the name of your App Registration,确保添加正确。我在这个类似问题里已经详细介绍过,你可以参考一下。

检索秘密Get权限足够,代码应该是

const retrievedSecret = await client.getSecret(secretName);
Run Code Online (Sandbox Code Playgroud)

我注意到您client.setSecret在代码中使用它,它用于保存秘密,要使用它,您可能需要许可Set

有关更多详细信息,请参阅快速入门:适用于 Node.js (v4) 的 Azure Key Vault 客户端库

更新:

我最终必须部署它,但不是在天蓝色中,而是在另一个环境中。如何设置环境变量并访问它。

如果是这样,您需要更改代码进行身份验证,直接在代码中使用这三个值。

改变线路

const { DefaultAzureCredential } = require("@azure/identity");
const credential = new DefaultAzureCredential();
Run Code Online (Sandbox Code Playgroud)

const { ClientSecretCredential } = require("@azure/identity");
const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
Run Code Online (Sandbox Code Playgroud)

请参阅 - https://www.npmjs.com/package/@azure/identity/v/1.0.3#authenticating-as-a-service-principal