web-dev-qa-db-ja.com

@ Azure / keyvault-secrets「リクエストにベアラーまたはPoPトークンエラー401がありません」

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に追加し、「reader」ロールを使用して、シークレットを「取得」する機能だけを提供します。

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.' } } }
3
MichaelB

キーのボールトシークレットをAzure関数と統合する方法 については、このブログをフォローしてください

主な手順は_Enable system-asigned managed identity for the Function App_と_Add Key Vault access policy for the Function App_です。

enter image description here

これらの後、@Microsoft.KeyVault(SecretUri={copied identifier for the username secret})を使用して、Function App構成にKey Vaultシークレット参照を追加することを忘れないでください。正しく設定すると、設定後に以下の画像が表示されます。

enter image description here

そして、以下は私のテスト結果です。秘密を取得するために_os.environ[name]_を使用します。

enter image description here

1
George Chen