【问题标题】:How to access Key Vault with Azure Managed Service Identity in node?如何在节点中使用 Azure 托管服务标识访问 Key Vault?
【发布时间】:2019-11-26 22:02:41
【问题描述】:

我按照说明 here 创建托管服务标识。所以现在在我的环境变量中,我有 MSI_ENDPOINT 和 MSI_SECRET。

在我的 typescript (node.js) 项目中,我导入了以下项目:

import {KeyVaultCredentials, KeyVaultClient} from "azure-keyvault";
import {AuthenticationContext, ErrorResponse, TokenResponse} from "adal-node";

如果我没有使用 MSI,我可以使用以下代码访问我的密钥库:

let keyVaultCredentials = new KeyVaultCredentials(KeyVault.createAuthenticator(this.clientID, this.clientKey));
let keyVaultClient = new KeyVaultClient(keyVaultCredentials);
private static createAuthenticator(clientID: string, clientKey: string){
  return (challenge, callback) => {
  let context = new AuthenticationContext(challenge.authorization);
  return context.acquireTokenWithClientCredentials(
      challenge.resource,
      clientID,
      clientKey,
      function (err, tokenResponse:TokenResponse | ErrorResponse) {
          if (err) {
              CLogger.log("error", "Error occurred while acquiring token with key vault credentials: " + JSON.stringify(err));
              throw new Error("Error occurred while acquiring token with key vault credentials. Check log files");
          }
          if(<TokenResponse>tokenResponse){
              let authorizationValue = (<TokenResponse>tokenResponse).tokenType + " " + (<TokenResponse>tokenResponse).accessToken;
              return callback(null, authorizationValue);
          }
      });
  }
}

我不知道如何在启用 MSI 的情况下获取访问令牌,请帮助。

【问题讨论】:

    标签: node.js azure typescript adal azure-keyvault


    【解决方案1】:

    使用适用于 js 的新 Azure SDK,您可以通过实现包 @azure/identity 中的类 DefaultAzureCredential 使用托管服务对您的应用程序进行身份验证。

    const {DefaultAzureCredential} = require('@azure/identity');
    const {SecretClient} = require('@azure/keyvault-secrets');
    
    const credential = new DefaultAzureCredential();
      
    const vaultName = "<key-vault-name>";
    const url = `https://${vaultName}.vault.azure.net`;
      
    const client = new SecretClient(url, credential);
    
    client.setSecret(secretName, "MySecretValue");
    ........

    它同时支持服务主体和托管身份认证。

    要在本地环境中运行它,您必须设置三个环境变量:AZURE_TENANT_ID、AZURE_CLIENT_ID 和 AZURE_CLIENT_SECRET 才能连接到服务主体。

    在 Azure 上,如果未定义这些变量,它将尝试使用托管标识进行身份验证。

    有一个快速入门指南here

    【讨论】:

      【解决方案2】:

      使用 ms-rest-azure 中的 loginWithAppServiceMSI() 方法将自动检测您是否在 WebApp 上并从 MSI 端点获取令牌。然后,代码很简单:

      function getKeyVaultCredentials(){
          return msRestAzure.loginWithAppServiceMSI({resource: 'https://vault.azure.net'});
      }
      
      function getKeyVaultSecret(credentials) {
          let keyVaultClient = new KeyVault.KeyVaultClient(credentials);
          return keyVaultClient.getSecret(KEY_VAULT_URI, 'secret', "");
      }
      
      getKeyVaultCredentials().then(
          getKeyVaultSecret
      ).then(function (secret){
          console.log(`Your secret value is: ${secret.value}.`);
      }).catch(function (err) {
          throw (err);
      });
      

      我建议查看完整文档 here

      【讨论】:

        猜你喜欢
        • 2020-06-02
        • 1970-01-01
        • 2021-10-11
        • 2020-12-23
        • 2020-08-29
        • 2021-11-20
        • 2021-07-29
        • 2021-11-07
        • 2022-09-28
        相关资源
        最近更新 更多