@ azure / keyvault-secrets 'В запросе отсутствует токен на предъявителя или PoP Ошибка 401' - PullRequest
3 голосов
/ 28 октября 2019

Я пытаюсь получить некоторые секреты из хранилища ключей Azure, но не могу подтвердить подлинность с помощью модуля @ azure / identity.

Версии:

"@azure/identity": "^1.0.0-preview.6",
"@azure/keyvault-secrets": "^4.0.0-preview.9",

У меня есть приложение с функциями Azureи я настроил приложение как в производственном, так и локальном режиме, используя local.settings.json, указав правильные значения для:

{
    "IsEncrypted": false,
    "Values": {
        "AZURE_CLIENT_ID": "REDACTED",
        "AZURE_CLIENT_SECRET": "REDACTED",
        "AZIRE_TENANT_ID": "REDACTED"
    },
    "ConnectionStrings": {}
}

  • Приложение, зарегистрированное через Azure Active Directory => Регистрация приложений.
  • Отключен вход в систему
  • Создан секрет приложения

Затем я добавил приложение в keyvault с ролью «читатель», которая дает ему возможность «получать» секреты, но ничегоиначе, даже нет списка:

Role Assignment screenshot

Теперь, когда я пытаюсь получить секреты:

import { KeyVaultSecret, SecretClient } from '@azure/keyvault-secrets';
import { EnvironmentCredential } from '@azure/identity';

export const GetSecret = async (key: string): Promise<string> => {
    try {
        const credential: EnvironmentCredential = new EnvironmentCredential();

        console.log('CREDENTIAL: ', credential);
        console.log('CLIENT SECRET', process.env.AZURE_CLIENT_SECRET);
        console.log('CLIENT ID', process.env.AZURE_CLIENT_ID);

        const url = 'https://tlabs-vault.vault.azure.net';
        const client = new SecretClient(url, credential);
        let secret: KeyVaultSecret = await client.getSecret(key);
        return secret.value;
    } catch (err) {
        console.error('Error getting secret from Azure Vault', err);
    }
};

Но это не работает, на консоли я вижу результат учетных данных как:

EnvironmentCredential { _credential: undefined }

И полный запрос, который выдает ошибку:

request:
[10/28/2019 1:14:16 PM]    WebResource {
[10/28/2019 1:14:16 PM]      streamResponseBody: false,
[10/28/2019 1:14:16 PM]      url:
[10/28/2019 1:14:16 PM]       'https://REDACTED_VAULT_NAME.vault.azure.net/secrets/REDACTED_SECRET_NAME/?api-version=7.0',
[10/28/2019 1:14:16 PM]      method: 'GET',
[10/28/2019 1:14:16 PM]      headers: HttpHeaders { _headersMap: [Object] },
[10/28/2019 1:14:16 PM]      body: undefined,
[10/28/2019 1:14:16 PM]      query: undefined,
[10/28/2019 1:14:16 PM]      formData: undefined,
[10/28/2019 1:14:16 PM]      withCredentials: false,
[10/28/2019 1:14:16 PM]      abortSignal: undefined,
[10/28/2019 1:14:16 PM]      timeout: 0,
[10/28/2019 1:14:16 PM]      onUploadProgress: undefined,
[10/28/2019 1:14:16 PM]      onDownloadProgress: undefined,
[10/28/2019 1:14:16 PM]      proxySettings: undefined,
[10/28/2019 1:14:16 PM]      keepAlive: true,
[10/28/2019 1:14:16 PM]      operationSpec:
[10/28/2019 1:14:16 PM]       { httpMethod: 'GET',
[10/28/2019 1:14:16 PM]         path: 'secrets/{secret-name}/{secret-version}',
[10/28/2019 1:14:16 PM]         urlParameters: [Array],
[10/28/2019 1:14:16 PM]         queryParameters: [Array],
[10/28/2019 1:14:16 PM]         responses: [Object],
[10/28/2019 1:14:16 PM]         serializer: [Serializer] } },
[10/28/2019 1:14:16 PM]   response:
[10/28/2019 1:14:16 PM]    { body:
[10/28/2019 1:14:16 PM]       '{"error":{"code":"Unauthorized","message":"Request is missing a Bearer or PoP token."}}',
[10/28/2019 1:14:16 PM]      headers: HttpHeaders { _headersMap: [Object] },
[10/28/2019 1:14:16 PM]      status: 401,
[10/28/2019 1:14:16 PM]      parsedBody: { error: [Object] } },
[10/28/2019 1:14:16 PM]   details:
[10/28/2019 1:14:16 PM]    { error:
[10/28/2019 1:14:16 PM]       { code: 'Unauthorized',
[10/28/2019 1:14:16 PM]         message: 'Request is missing a Bearer or PoP token.' } } }

1 Ответ

1 голос
/ 31 октября 2019

Пожалуйста, следуйте этому блогу о том, как Интегрировать секреты хранилища ключей с функциями Azure .

Основные шаги: Enable system-asigned managed identity for the Function App и Add Key Vault access policy for the Function App.

enter image description here

После этого не забудьте добавить ссылку на секреты хранилища ключей в конфигурации Function App с помощью @Microsoft.KeyVault(SecretUri={copied identifier for the username secret}). Если вы установите его правильно, после настройки на нем будет отображено следующее изображение:

enter image description here

И ниже мой результат теста, я использую os.environ[name], чтобы получитьсекрет.

enter image description here

...