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对象,担心其内部封装的令牌会在迭代过程或后续操作中过期,因此咨询以下问题:
Azure.Authenticated对象的TTL(生存时间)是多少?- 当TTL过期时,是否需要重新创建
Azure对象? - 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
相关产品推荐
相关产品推荐

