#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
};