Почему Azure KeyVault getSecret возвращает обещание ?

#node.js #azure #azure-keyvault

#node.js #azure #azure-keyvault

Вопрос:

Я следовал руководству Microsoft по этой ссылке: https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-node но я хочу иметь их как отдельные функции вместо того, чтобы объединять их в одну основную функцию.

Это то, что у меня есть, setSecret работает нормально, но getSecret возвращает обещание?

Это ссылка на скриншот моего кода

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

1. Вместо того, чтобы делиться скриншотом кода, пожалуйста, поделитесь кодом.

2. В чем проблема возврата Promise<KeyVaultSecret> ? SDK предлагает этот метод. Вы хотите найти метод синхронизации?

3. Получение секрета хранилища ключей через rest api также является асинхронным методом, я опубликовал подробности ниже. Если вы чувствуете, что мой пост вам полезен, не могли бы вы выбрать его в качестве ответа? Если возникнут дополнительные проблемы, пожалуйста, не стесняйтесь добавлять комментарии здесь.

Ответ №1:

Оба getSecret и setSecret возвращают a Promise , потому что они являются асинхронными методами, которым необходимо выполнить HTTP-запрос к службе хранилища ключей.

Если бы вы попытались выполнить следующее:

 const secretPromise = client.setSecret(secretName, secretValue);
 

Вы заметите, что secretPromise это Promise<KeyVaultSecret> соответствует документации API

Это позволяет дождаться установки секрета и вернуть вновь установленный секрет:

 const secret = await client.setSecret(secretName, secretValue);
 

Помните, что, не дожидаясь успешного завершения setSecret вызова, вы не сможете:

  • Получите вновь созданный секрет (если вам не повезет со временем)
  • Получать уведомления и обрабатывать любые ошибки в случае setSecret сбоя (вы можете проверить это, создав секретный клиент с недопустимым URL хранилища ключей и запустив обе функции — azureSetSecret заявит об успехе, но azureGetSecret выдаст ошибку)

Ответ №2:

Я не уверен, пытаетесь ли вы найти способ, позволяющий получить секреты хранилища ключей в nodejs. В качестве примера быстрого запуска, о котором вы упоминали выше, Microsoft предоставляет асинхронный метод await client.getSecret(secretName) для nodejs.

Здесь я хотел бы порекомендовать вам использовать rest api для доступа к секретному хранилищу ключей. При вызове api вам необходимо сгенерировать токен доступа в качестве заголовка запроса, вы можете обратиться к этому образцу или взглянуть на мой тестовый проект ниже.

вызов api:

 const axios = require('axios');
const auth = require('./credenticalflow');

let vaultName = 'key vault name';
let keyName = 'key name';
let accesstoken = '';
let secret = '';

init();

async function init(){
    const authResponse = await auth.getToken(auth.tokenRequest);
    accesstoken = authResponse.accessToken;
    getsecret(vaultName,keyName,accesstoken);
    console.log("22222222:" secret);
}

 function getsecret(vaultName,keyName,token){
     console.log('the token is :'  token);
    axios.get('https://' vaultName '.vault.azure.net/secrets/' keyName '/7d4b682f5c9a41578602aa5b86611aa7?api-version=7.1',{
        headers: {
            'Authorization': 'Bearer ' token
        }
    })
    .then(function (response) {
        // handle success
        secret = response.data.value;
        console.log("1111111:" secret);
    })
    .catch(function (error) {
        // handle error
        console.log('error');
    });
}
 

сгенерировать токен доступа:

 const msal = require('@azure/msal-node');

const msalConfig = {
    auth: {
        clientId: 'azure ad app cilent id',
        authority: 'https://login.microsoftonline.com/<your tenant name such as xx.onmicrosoft.com>',
        clientSecret: 'client secret for the azure ad app',
    }
};

const tokenRequest = {
    scopes: ['https://vault.azure.net/.default'],
};

const cca = new msal.ConfidentialClientApplication(msalConfig);

async function getToken(tokenRequest) {
    return await cca.acquireTokenByClientCredential(tokenRequest);
}

module.exports = {
    tokenRequest: tokenRequest,
    getToken: getToken
};