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

如何通过Java SDK验证Azure AD令牌过期并重新生成(TokenCredentialAuthProvider)

如何判断客户端凭证流的令牌过期并获取新令牌?

我用这段Java代码通过客户端凭证流获取Microsoft Graph令牌,现在想知道怎么判断令牌过期,以及什么时候重新执行这段代码获取新令牌。另外,我不确定该检查ClientSecretCredential、TokenCredentialAuthProvider还是GraphServiceClient是否为null来触发重新获取?

try {
    final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
            .clientId(clientId)
            .clientSecret(clientSecret)
            .tenantId(tenantId).build();

    final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(
            Arrays.asList(".default"), clientSecretCredential);

    graphClient = GraphServiceClient.builder().authenticationProvider(tokenCredentialAuthProvider)
            .buildClient();
} catch (Exception e) {
    // TODO: handle exception
}

核心结论

客户端凭证流不会返回刷新令牌,但你无需手动跟踪令牌过期时间——TokenCredentialAuthProvider和ClientSecretCredential内部已经实现了令牌的自动缓存与刷新逻辑。

具体说明

  1. 无需手动检查令牌过期
    ClientSecretCredential会自动缓存获取到的访问令牌,当令牌接近过期或已过期时,它会自动发起新的请求获取令牌,全程不需要你手动干预。

  2. 不需要检查对象是否为null
    只要初始化成功,ClientSecretCredential、TokenCredentialAuthProvider和GraphServiceClient实例可以长期复用,不需要反复创建。只有当这些实例被意外销毁(如被垃圾回收)时,才需要重新初始化。

  3. 触发重新初始化的场景

    • 客户端密钥、客户端ID或租户ID发生变更
    • 首次初始化时抛出异常(如网络故障、凭证无效),需要重试
    • graphClient实例被意外置为null
    • 调用Graph API时收到401 InvalidAuthenticationToken错误(极少数情况下缓存逻辑失效时)

优化实现示例

可以在调用Graph API时捕获认证异常,触发重新初始化并重试请求:

// 调用Graph API的示例方法
public User getCurrentUser() {
    try {
        return graphClient.me().buildRequest().get();
    } catch (ServiceException e) {
        // 检测到令牌无效/过期错误
        if ("401".equals(e.getResponseCode()) && e.getMessage().contains("InvalidAuthenticationToken")) {
            // 重新初始化客户端
            reinitializeGraphClient();
            // 重试请求
            return graphClient.me().buildRequest().get();
        }
        // 其他异常抛出或处理
        throw e;
    }
}

// 重新初始化Graph客户端的方法
private void reinitializeGraphClient() {
    try {
        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .clientSecret(clientSecret)
                .tenantId(tenantId).build();

        final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(
                Arrays.asList(".default"), clientSecretCredential);

        graphClient = GraphServiceClient.builder().authenticationProvider(tokenCredentialAuthProvider)
                .buildClient();
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException("Failed to reinitialize Graph client", e);
    }
}

内容的提问来源于stack exchange,提问作者Avinash Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:53:16