【问题标题】:Get Secret from Azure Keyvault using nodejs使用 nodejs 从 Azure Keyvault 获取 Secret
【发布时间】:2020-08-10 15:36:21
【问题描述】:

我需要读取 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)
}

【问题讨论】:

  • 你在哪里运行你的代码?在本地或 azure web 应用中?
  • @JoyWang ;在本地

标签: node.js azure azure-active-directory azure-keyvault


【解决方案1】:

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

所以在你的情况下,你需要register an application with Azure AD,并获取tenant id, client id(i.e. application id)client secret(i.e. application secret),设置environmental variablesAZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID

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

所以当你添加它时,你可以直接搜索client Id(i.e. application Id)the name of your App Registration,确保你添加的是正确的。我在这个similar issue里给出了详细信息,你可以参考一下。

retrieve the secretGet权限就够了,代码应该是

const retrievedSecret = await client.getSecret(secretName);

我注意到您在代码中使用了client.setSecret,它用于save a secret,要使用它,您可能需要Set 权限。

更多详情请见Quickstart: Azure Key Vault client library for Node.js (v4)

更新:

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

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

换行

const { DefaultAzureCredential } = require("@azure/identity");
const credential = new DefaultAzureCredential();

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

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

【讨论】:

  • 谢谢。你说的对 。我创建了一个具有正确权限的新应用程序。它奏效了。我有最后一个问题,现在我需要在本地设置环境变量才能使其工作。我最终必须部署它,但不是在天蓝色,而是在另一个环境中。如何设置环境变量并访问它。
  • DefaultAzureCredential 将回退到 ManagedIdentityCredential,它应该可以在部署代码的环境中工作,例如 VM 或应用服务。见How to set and get secrets from Azure Key Vault with Azure Managed Identities and Node.js
【解决方案2】:

您只需按照以下步骤操作:

  • 通过应用注册在 Azure Active Directory(服务主体)中创建应用。
  • 转到 Key Vault 资源、访问策略刀片,为我们在上述步骤中创建的此 Azure AD 应用(服务主体)分配读取访问权限。
  • 在您的应用服务中设置这 3 个环境变量 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET。从我们在第 1 步中创建的应用中获取这些变量的值。
  • 使用我们现在已经在使用的DefaultAzureCredential。这将自动从我们在应用服务中为身份验证定义的环境变量中选择凭据。

另一种方法是动态获取 Key Vault 令牌并使用该令牌从 Key Vault 获取机密 - https://docs.microsoft.com/en-us/samples/azure-samples/app-service-msi-keyvault-node/app-service-msi-keyvault-node/

有用的参考资料:

【讨论】:

  • 谢谢安库什。我收到以下错误。我已经添加了所有权限的访问策略。它添加为复合实体,但我仍然收到以下错误{“name”:“RestError”,“code”:“Forbidden”,“statusCode”:403,“request”:{“streamResponseBody”:false,“url” :“lws-keyvault.azure.net/secrets/Demo/?api-version=7.0”,“方法”:“GET”,“标题”:{“_headersMap”:{“内容类型”:{“名称”:“内容类型”,“值”:“应用程序/json ; charset=utf-8" },
  • 所有步骤都完成了吗?您在什么时候收到此错误?
  • 我已经完成了所有的步骤。运行应用程序时出现此错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多