【问题标题】:How to refresh access token provided by TokenCredential / ClientSecretCredential by Azure Identity Java SDK?如何通过 Azure Identity Java SDK 刷新 TokenCredential / ClientSecretCredential 提供的访问令牌?
【发布时间】:2021-02-04 04:44:21
【问题描述】:

我正在尝试使用Azure Identity Java SDK 获取访问令牌,然后使用刷新令牌刷新它。

我使用以下 SDK:

  <dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.1.2</version>
  </dependency>

Java 代码 sn-p:

  context = new AuthenticationContext(authority, false, service);
  ClientCredential credential = new ClientCredential(clientId, clientSecret);
  Future<AuthenticationResult> future = context.acquireToken(resource, credential, null);
  token = future.get().getAccessToken();

在代码 sn-p 中,token 的有效期如预期一样为 1 小时,见Link

ClientSecretCredential实现了TokenCredential接口,说明刷新访问令牌必须单独实现。

我在 Microsoft 文档(或其他资源)中找不到任何描述如何使用 Java SDK 刷新令牌的示例。

刷新访问令牌的正确方法是什么?

【问题讨论】:

  • 你必须使用客户端凭证流吗?
  • 我正在使用StorageCredentialsToken 中的令牌来初始化CloudStorageAccount。在使用服务主体时,您会建议其他方法吗?
  • 您好@AndreasHessenthaler,您使用的是 MSAL 还是任何其他库?

标签: azure-active-directory access-token refresh-token azure-java-sdk azure-service-principal


【解决方案1】:

我认为刷新过程被 azure-identity 抽象掉了。

您可以通过AccessToken.getExpiresAt获取到期日期。

对于ClientSecretCredential,它可能不需要刷新。如果最后一个令牌过期,SDK 只需要获取一个新令牌(使用相同的密钥)。

对于其他例如InteractiveBrowserCredential 需要交互式流程来获取新令牌,刷新是有意义的。 它在 azure-identity here 中处理(您可以看到最后一个令牌何时过期或在其过期日期的 5 分钟内,它将被强制刷新),并在 MSAL here 中进一步处理。

不是官方回答,只是看代码。

【讨论】:

    【解决方案2】:

    使用客户端凭据身份验证时,正确的方法是从 ClientSecretCredential 对象请求新令牌。 您可以使用一个围绕 ClientSecretCredential 的包装器,它会将返回的令牌缓存 50 分钟,然后在该时间过去后,它会从 ClientSecretCredential 请求一个新令牌。

    【讨论】:

    • 当然,要求一个新的令牌有效。但我想知道如何正确 刷新 令牌,例如,通过使用来自 future 对象的刷新令牌 - 但是,在代码 sn-p 中为 null。
    • 使用客户端凭据流时没有刷新令牌。
    • 感谢您的回答。您能否指出任何文档和/或代码示例来展示您建议的缓存机制,包括刷新机制?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多