【问题标题】:Azure KeyVault Secret Get Throws CredentialUnavailableExceptionAzure KeyVault Secret Get 引发 CredentialUnavailableException
【发布时间】:2020-12-09 12:30:52
【问题描述】:

我正在使用 AzureKeyVault 存储秘密并在我的应用程序中检索它们。我正在使用带有最新版本的 azure-identity 和 azure-security-keyvault-secrets 库的 Spring Boot。这是完成这项工作的代码:

private SecretClient createDefaultAzureCredential() {
    DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
        .build();

    return new SecretClientBuilder()
        .vaultUrl(keyVaultUri)
        .credential(defaultCredential)
        .buildClient();
  }

  @Cacheable
  public String getSecret(String secretKey) {
    KeyVaultSecret secret = createDefaultAzureCredential().getSecret(secretKey);
    return secret.getValue();
  }

我使用 Azure CLI 进行了身份验证,一切正常。我可以得到我的秘密。 因为DefaultAzureCredential 正在使用以下尝试身份验证的顺序:https://i.stack.imgur.com/Y80vq.png, 我的日志充满了以下类型的异常:

com.azure.identity.CredentialUnavailableException: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.
   at com.azure.identity.EnvironmentCredential.getToken(EnvironmentCredential.java:123)
   at com.azure.identity.ChainedTokenCredential.lambda$getToken$2(ChainedTokenCredential.java:55)
   at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:378)
   at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:267)
---logs trimmed----

对于日志记录,我使用的是 logback。

有没有一种方法可以删除因身份验证尝试失败而导致的日志?我知道我可以禁用使用 logback 抛出它们的类的日志,但我不想这样做,因为我担心我会丢失可以在调试时使用的如此重要的日志。

【问题讨论】:

    标签: azure spring-boot logback azure-keyvault azure-cli


    【解决方案1】:

    我猜你正在使用虚拟机,请确认你正在设置以下系统environment variables

    • AZURE_CLIENT_ID - 服务主体的应用 ID
    • AZURE_TENANT_ID - 主体的 Azure Active Directory 租户的 ID
    • AZURE_CLIENT_SECRET - 服务主体的客户端机密之一

    对于以下问题:

    有一种方法可以删除因尝试失败而导致的日志 认证?

    Catch这个异常显式并且在块内什么都不做,例如:

    catch(CredentialUnavailableException ex)
    {}
    

    【讨论】:

    • 我在我的本地机器上开发,而不是在虚拟机上,我通过 Azure CLI 进行了身份验证。
    • 您可以尝试添加这些环境变量吗?
    • 在本地机器上添加环境变量可能会有所帮助。但我以不同的方式解决了这个问题。我为开发配置文件创建了两个 SecretClient bean,为 stag/prod 配置文件创建了一个。在开发配置文件中,我使用 AzureCliCredential,因为我们使用 azure CLI 进行身份验证,而在 stag/prog 上,我使用了 ManagedIdentityCredential,因为它在云上使用。
    • 哦,好吧,我的回答的第二部分是否有助于您捕捉异常?
    • 它有所帮助,但是通过我上面描述的解决方案,错误消失了,因为我使用的是显式方法而不是默认方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2021-12-19
    • 2021-12-11
    • 2023-03-15
    相关资源
    最近更新 更多