如何通过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内部已经实现了令牌的自动缓存与刷新逻辑。
具体说明
无需手动检查令牌过期
ClientSecretCredential会自动缓存获取到的访问令牌,当令牌接近过期或已过期时,它会自动发起新的请求获取令牌,全程不需要你手动干预。不需要检查对象是否为null
只要初始化成功,ClientSecretCredential、TokenCredentialAuthProvider和GraphServiceClient实例可以长期复用,不需要反复创建。只有当这些实例被意外销毁(如被垃圾回收)时,才需要重新初始化。触发重新初始化的场景
- 客户端密钥、客户端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
相关产品推荐
相关产品推荐

