You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Java SDK中Azure.Authenticated对象的过期机制及处理方案咨询

Azure Java SDK 中Authenticated对象令牌过期与续期问题

场景说明

我正在实现列出指定订阅下的存储账户并提取所有Blob端点的功能,具体流程如下:

  • 创建以subscriptionId为键、Azure.Authenticated对象为值的缓存,用于后续SDK API调用复用
  • 若缓存中无对应subscriptionId,则创建Azure.Authenticated对象并存入缓存:
ApplicationTokenCredentials credentials = new ApplicationTokenCredentials(
    subscription.getClientId(),
    subscription.getTenantId(),
    subscription.getKey(),
    subscription.getEnvironmentType().getEnvironment());
Azure.Authenticated authenticatedClient = Azure.configure()
    .withLogLevel(LogLevel.NONE)
    .authenticate(credentials);
  • 通过订阅ID获取Azure对象:
Azure azure = authenticatedClient.withSubscription(subscription.getSubscriptionId());
  • 分页列出该订阅下所有存储账户:
try {
    PagedList<StorageAccount> strgAccList = azure.storageAccounts().list();
    boolean hasNextPage = null != strgAccList.currentPage();
    int pageCount = 0;
    if (hasNextPage) {
        while (hasNextPage) {
            ++pageCount;
            Page<StorageAccount> resourcePage = strgAccList.currentPage();
            Iterator<StorageAccount> it = resourcePage.items().iterator();
            while (it.hasNext()) {
                StorageAccount storageAccount = it.next();
                storageAccounts.put(storageAccount.name(), storageAccount);
            }
            hasNextPage = strgAccList.hasNextPage();
            if (hasNextPage) {
                strgAccList.loadNextPage();
            }
        }
    }
} catch (Exception e) {
    //log exception here
}

由于我缓存了Azure对象,担心其内部封装的令牌会在迭代过程或后续操作中过期,因此咨询以下问题:

  1. Azure.Authenticated对象的TTL(生存时间)是多少?
  2. 当TTL过期时,是否需要重新创建Azure对象?
  3. SDK API是否会自动处理令牌的续期?

专业解答

1. Azure.Authenticated对象的TTL

Azure.Authenticated本身没有固定的生存时间,但它依赖的ApplicationTokenCredentials从Azure AD获取的访问令牌,默认TTL为60分钟。这个有效期是Azure AD颁发令牌时设定的,SDK会存储该令牌直到过期。

2. TTL过期时是否需要重新创建Azure对象?

不需要直接重新创建Azure对象,但需要处理底层凭证的令牌刷新。不过这里有个关键细节:你使用的ApplicationTokenCredentials(基于客户端密钥的凭证)不会自动刷新令牌——一旦令牌过期,后续API调用会抛出令牌过期相关的异常(比如TokenExpiredException)。

如果你的缓存策略是长期持有Azure.Authenticated或Azure对象,那么当令牌过期时,你需要重新创建ApplicationTokenCredentials和对应的Azure.Authenticated对象,并更新缓存中的条目。

3. SDK API是否会自动处理令牌续期?

这取决于你使用的凭证类型:

  • ApplicationTokenCredentials(客户端密钥方式):不会自动续期。这种凭证只会一次性获取令牌,没有内置的刷新逻辑,令牌过期后必须重新执行认证流程获取新令牌。
  • DeviceTokenCredentials或UserTokenCredentials(用户交互方式):SDK会自动处理令牌续期,因为这类凭证支持刷新令牌机制,当访问令牌过期时会自动用刷新令牌获取新的访问令牌。

针对你的场景优化建议

为了避免缓存对象因令牌过期导致异常,建议在缓存逻辑中加入以下处理:

  • 缓存中同时存储Azure.Authenticated对象和令牌的过期时间(可从凭证中提取或通过SDK内部方法获取)
  • 每次使用缓存对象前,检查令牌是否即将过期(比如提前5分钟),如果是则重新创建认证对象并更新缓存
  • 或者在捕获到令牌过期异常时,自动重新创建认证对象并重试API调用

内容的提问来源于stack exchange,提问作者Raj V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:37:51