Не удается получить учетные данные MSI с помощью NodeJS

#node.js #azure-functions #identity

#node.js #azure-функции #идентификация

Вопрос:

Я работаю с NodeJS Azure Function V2 и хочу получить секрет из хранилища ключей. Я попытался по следующей ссылке. Вот ссылка.

Я использую пакет библиотеки NPM ms-rest-azure.

Мой код выглядит следующим образом:

     function getKeyVaultCredentials(){
        return msRestAzure.loginWithAppServiceMSI({resource: "https://my-keyvault-DNS-url.vault.azure.net",msiEndpoint: process.env["MSI_ENDPOINT"],msiSecret:process.env["MSI_SECRET"]});
    }

    function getKeyVaultSecret(credentials) {
      var keyVaultClient = new KeyVault.KeyVaultClient(credentials);
      return keyVaultClient.getSecret("https://my-keyvault-DNS-url.vault.azure.net", 'secret', "mySecretName");
    }

    getKeyVaultCredentials().then(
        getKeyVaultSecret
    ).then(function (secret){
        console.log(`Your secret value is: ${secret.value}.`);
    }).catch(function (err) {
        throw (err);
    });
  

Вызов функции выполнен успешно, но учетные данные так и не были получены.

Примечание: Я включил идентификатор MSI и предоставил доступ к kevault для этой функции Azure.

Ошибка, которую я получаю, заключается в следующем:
MSI: Failed to retrieve a token from "http://127.0.0.1:410056/MSI/token/?resource=https://my-keyvault-DNS-url.vault.azure.netamp;api-version=2017-09-01" with an error: {"ExceptionMessage":"AADSTS500011: The resource principal named https://my-keyvault-DNS-url.vault.azure.net was not found in the tenant named 6620834b-d11e-44cb-9931-2e08b6ee81cc00. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant.rnTrace ID: 1f25ac6c-01e0-40d8-8146-269f22d49f001rnCorrelation ID: 4beede0c-2e83-4bcc-944d-ba4e8ec2c6834rnTimestamp: 2019-03-29 02:54:40Z","ErrorCode":"invalid_resource","ServiceErrorCodes":["500011"],"StatusCode":400,"Message":null,"CorrelationId":"e6e8108d-e605-456b-8fb6-473962dcd5d678"}

Возможно, я делаю какую-то глупость / промах — пожалуйста, помогите!!

Комментарии:

1. расскажите подробнее «о том, что вы никогда не получаете учетные данные»? например. был ли когда-либо выполнен вызов? Если сделано, было ли это успешным или неудачным? Если не удалось, в чем ошибка и т.д.

2. @Suwat — Я развернул приложение в облаке и сделал вызов postman. Я получаю сообщение об успешном выполнении следующего содержания: Функции выполнены. NodeJsFunctionAppV2′ (Успешно, Id = 8840ef3f-82e8-4e0c-a08e-a1c5a2a3b9fd)

3. @Suwat — обновил мой вопрос с исключением, с которым я столкнулся.

Ответ №1:

Есть несколько тонких исправлений, которые необходимы вашему коду

  1. resource должно быть установлено значение https://vault.azure.net . По сути, это должен быть ресурс в целом, а не ваш экземпляр как таковой.

  2. Метод на самом деле getSecret('<KEYVAULT_URI>', '<SECRET_NAME>', '<SECRET_VERSION>')

Вот как ваш код должен выглядеть в конце

 function getKeyVaultCredentials() {
  return msRestAzure.loginWithAppServiceMSI({
    resource: 'https://vault.azure.net'
  });
}

function getKeyVaultSecret(credentials) {
  var keyVaultClient = new KeyVault.KeyVaultClient(credentials);
  return keyVaultClient.getSecret(
    'https://my-keyvault-DNS-url.vault.azure.net',
    'mySecretName',
    ''
  );
}

getKeyVaultCredentials()
  .then(getKeyVaultSecret)
  .then(function(secret) {
    console.log(`Your secret value is: ${secret.value}.`);
  })
  .catch(function(err) {
    throw err;
  });