无法使用 azure JavaScript 函数和 Key Vault 机密检索 cosmosDB 数据
Unable to retrieve cosmosDB data using azure JavaScript function and Key Vault secret
我正在使用 Azure 函数 (JavaScript/node) 从 CosmosDB 查询和检索数据。那很好用。但是,我未能成功实施密钥保管库机密来存储 cosmosDB 的主密钥。我收到错误:
Executed 'Functions.getProjects' (Failed, Id=f319f320-af1c-4283-a8f4-43cc6becb3ca,
Duration=1289ms)
[6/7/2021 4:37:44 AM] System.Private.CoreLib: Exception while executing function:
Functions.getProjects. System.Private.CoreLib: Result: Failure
Exception: Error: Required Header authorization is missing. Ensure a valid Authorization token
is passed.
我遵循了多个教程,了解我需要对 Azure 中的代码执行哪些操作 运行 以及我需要对 VS 代码中的本地代码执行哪些操作 运行。对于 Azure 中的 运行,我创建了我的密钥保管库并添加了密钥。我在我的函数上启用了系统分配的托管标识,以便它创建一个服务主体。然后,我在密钥保管库中创建了一个访问策略,允许我的 function/service 委托人 GET、LIST 功能。我在 Azure 中测试函数时遇到与在本地测试时相同的错误。
我的代码:config.js - 为安全起见隐藏了端点和密钥
const config = {
endpoint: "https://<mysiteonazure>.documents.azure.com:443/",
key:
"myreallylongkeyhiddenforsecurity",
databaseId: "projectsDB",
containerId: "projects",
partitionKey: { kind: "Hash", paths: ["/category"] },
};
module.exports = config;
我的代码:index.js
const config = require("../sharedCode/config");
const { CosmosClient } = require("@azure/cosmos");
const { DefaultAzureCredential } = require("@azure/identity");
const { SecretClient } = require("@azure/keyvault-secrets");
// this value is specified in local.settings.json file for local testing
const keyVaultName = process.env["KEY_VAULT_NAME"];
const keyVaultUri = `https://${keyVaultName}.vault.azure.net`;
// checks to see if local.settings.json has value first, indicates local
// second uses managed identity, indicating azure, since local.settings.js not uploaded
const credential = new DefaultAzureCredential();
const secretClient = new SecretClient(keyVaultUri, credential);
module.exports = async function (context, req) {
const endpoint = config.endpoint;
const key = await secretClient.getSecret("cosmosProjectKey");
const keyx = key.value;
const client = new CosmosClient({ endpoint, keyx });
const database = client.database(config.databaseId);
const container = database.container(config.containerId);
const querySpec = {
query: "SELECT * from c",
};
let myprojects = [];
const { resources: items } = await container.items
.query(querySpec)
.fetchAll();
items.forEach((item) => {
myprojects.push(`${item.id} - ${item.project}`);
});
context.res = {
// status: 200, /* Defaults to 200 */
body: items,
};
};
正如我提到的,当我在配置文件中对密钥进行硬编码(不是最好的 JS 编码)时,我的代码可以工作。我删除了所有表明密钥值是从密钥保管库返回的注释。我还遗漏了我创建了另一个服务主体,我相信当我在本地 运行 启用该功能时尝试访问密钥库时会使用它。
非常感谢任何帮助。
请更改以下代码行:
const key = await secretClient.getSecret("cosmosProjectKey");
const keyx = key.value;
到
const secretKey = await secretClient.getSecret("cosmosProjectKey");
const key = secretKey.value;
并使用以下内容创建您的 CosmosClient
const client = new CosmosClient({ endpoint, key });
其他选择是像这样创建您的 CosmosClient:
const client = new CosmosClient({ endpoint, key: keyx });
我正在使用 Azure 函数 (JavaScript/node) 从 CosmosDB 查询和检索数据。那很好用。但是,我未能成功实施密钥保管库机密来存储 cosmosDB 的主密钥。我收到错误:
Executed 'Functions.getProjects' (Failed, Id=f319f320-af1c-4283-a8f4-43cc6becb3ca,
Duration=1289ms)
[6/7/2021 4:37:44 AM] System.Private.CoreLib: Exception while executing function:
Functions.getProjects. System.Private.CoreLib: Result: Failure
Exception: Error: Required Header authorization is missing. Ensure a valid Authorization token
is passed.
我遵循了多个教程,了解我需要对 Azure 中的代码执行哪些操作 运行 以及我需要对 VS 代码中的本地代码执行哪些操作 运行。对于 Azure 中的 运行,我创建了我的密钥保管库并添加了密钥。我在我的函数上启用了系统分配的托管标识,以便它创建一个服务主体。然后,我在密钥保管库中创建了一个访问策略,允许我的 function/service 委托人 GET、LIST 功能。我在 Azure 中测试函数时遇到与在本地测试时相同的错误。
我的代码:config.js - 为安全起见隐藏了端点和密钥
const config = {
endpoint: "https://<mysiteonazure>.documents.azure.com:443/",
key:
"myreallylongkeyhiddenforsecurity",
databaseId: "projectsDB",
containerId: "projects",
partitionKey: { kind: "Hash", paths: ["/category"] },
};
module.exports = config;
我的代码:index.js
const config = require("../sharedCode/config");
const { CosmosClient } = require("@azure/cosmos");
const { DefaultAzureCredential } = require("@azure/identity");
const { SecretClient } = require("@azure/keyvault-secrets");
// this value is specified in local.settings.json file for local testing
const keyVaultName = process.env["KEY_VAULT_NAME"];
const keyVaultUri = `https://${keyVaultName}.vault.azure.net`;
// checks to see if local.settings.json has value first, indicates local
// second uses managed identity, indicating azure, since local.settings.js not uploaded
const credential = new DefaultAzureCredential();
const secretClient = new SecretClient(keyVaultUri, credential);
module.exports = async function (context, req) {
const endpoint = config.endpoint;
const key = await secretClient.getSecret("cosmosProjectKey");
const keyx = key.value;
const client = new CosmosClient({ endpoint, keyx });
const database = client.database(config.databaseId);
const container = database.container(config.containerId);
const querySpec = {
query: "SELECT * from c",
};
let myprojects = [];
const { resources: items } = await container.items
.query(querySpec)
.fetchAll();
items.forEach((item) => {
myprojects.push(`${item.id} - ${item.project}`);
});
context.res = {
// status: 200, /* Defaults to 200 */
body: items,
};
};
正如我提到的,当我在配置文件中对密钥进行硬编码(不是最好的 JS 编码)时,我的代码可以工作。我删除了所有表明密钥值是从密钥保管库返回的注释。我还遗漏了我创建了另一个服务主体,我相信当我在本地 运行 启用该功能时尝试访问密钥库时会使用它。
非常感谢任何帮助。
请更改以下代码行:
const key = await secretClient.getSecret("cosmosProjectKey");
const keyx = key.value;
到
const secretKey = await secretClient.getSecret("cosmosProjectKey");
const key = secretKey.value;
并使用以下内容创建您的 CosmosClient
const client = new CosmosClient({ endpoint, key });
其他选择是像这样创建您的 CosmosClient:
const client = new CosmosClient({ endpoint, key: keyx });