当前位置: 首页 > 知识库问答 >
问题:

使用nodejs从Azure Keyvault获取秘密

仲浩歌
2023-03-14

我需要阅读Azure active directory中的用户列表。客户已经创建了一个Graph API应用程序,但他们不想共享应用程序的客户机密,而是要求我们使用密钥库。如何从节点访问。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)
}

共有2个答案

糜运良
2023-03-14

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

  • 从应用注册在Azure Active Directory(服务主体)中创建应用

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

有用的参考资料:

  • https://www.rahulpnath.com/blog/defaultazurecredential_from_azure_sdk/
潘璞瑜
2023-03-14

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

因此,在您的情况下,需要向Azure AD注册应用程序,并获取租户id客户端id(即应用程序id)客户端机密(即应用程序机密)、设置环境变量、AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID

对于您得到的403错误,我注意到您说,它添加为复合实体,根据我的经验,您没有将与广告应用相关的正确服务主体正确添加到keyvault的访问策略。如果添加正确,它将显示为应用程序,而不是复合标识

因此,当您添加它时,您可以直接搜索客户端Id(即应用程序Id)应用程序注册的名称,确保您添加了正确的。我在类似的问题上给出了细节,你可以参考。

要检索秘密,get权限就足够了,代码应该是

const retrievedSecret = await client.getSecret(secretName);

我注意到你使用了客户端。设置机密在您的代码中,它用于保存机密,要使用它,您可能需要设置权限。

有关更多详细信息,请参阅Quickstart:Azure Key Vault client library For Node。js(v4)。

更新:

我最终需要部署它,但不是在azure中,而是在另一个环境中。如何设置环境变量并访问它。

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

改变台词

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/标识/v/1.0.3#身份验证为服务主体

 类似资料:
  • 我想从天蓝色密钥库获取秘密。当我独立于主方法运行类时,它返回秘密,但当我在代码行future.get()处集成了这个相同的代码在servlet应用程序中;在这里它得到块,它不会像死锁一样继续前进,它一直在等待,有时会得到java.util.concurrent.执行异常:java.lang.ClassCastExctive:java.lang.字符串不能被强制转换为java.util.列表和com

  • 在图表部署CI/CD管道期间,有没有办法从GCP机密管理器中检索掌舵图表的机密?还是最好使用CI/CD secret manager,然后为图表部署获取凭据?

  • 在尝试使用AzureKeyVault保护密钥时,我遇到以下错误: 00:01:41错误]读取钥匙圈时出错。微软蔚蓝色的钥匙库。模型。KeyVaultErrorException:操作在Microsoft返回了无效的状态代码“禁止”。蔚蓝色的钥匙库。KeyVault客户端。WrapkeyWithTtpMessageAsync(String Vault BaseUrl、String keyName、S

  • 问题内容: 我有一个带有多个对象的集合“ companies”。每个对象都有“ _id”参数。我正在尝试从数据库获取此参数: 因此,我请求公司/ 4fcfd7f246e1464d05000001(4fcfd7f246e1464d05000001是我需要的对象的_id- parma),并且findOne不返回任何内容,这就是为什么console.log(’该公司没有数据’); 执行。 我绝对确定我有

  • 我正在我的页面welcomeuser中从此路由获取数据 现在我想使用这个锚标记从来到WelcomeUser.ejs页面的value1中获取userid。我该怎么做呢?这是上面WelcomePage.ejs中的一行,我正在其中获取整个数据。