Web应用中如何自动刷新Azure AD访问令牌?基于Microsoft Graph
自动处理Microsoft Graph令牌刷新的实现方案
你可以借助Azure Identity库中的RefreshTokenCredential类实现令牌自动刷新,无需手动触发刷新逻辑。这个组件会在Access Token过期时,自动使用已存储的Refresh Token向Microsoft身份服务请求新的Access Token,同时可捕获刷新后的令牌信息更新本地存储。
具体实现步骤
1. 添加依赖
确保项目引入Azure Identity库(以Maven为例):
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.12.0</version> <!-- 建议使用最新稳定版本 --> </dependency>
2. 替换TokenCredential实现
抛弃当前手动返回固定令牌的TokenCredential,改用RefreshTokenCredential构建认证提供者:
// 从本地存储读取已保存的Refresh Token和应用客户端ID String storedRefreshToken = account.getRefreshToken(); String clientId = "你的Microsoft应用客户端ID"; // 构建自动刷新的凭证实例 RefreshTokenCredential refreshTokenCredential = new RefreshTokenCredentialBuilder() .clientId(clientId) .refreshToken(storedRefreshToken) .build(); // 初始化GraphServiceClient TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(refreshTokenCredential); this.graphServiceClient = GraphServiceClient.builder() .authenticationProvider(authProvider) .buildClient();
3. 更新本地存储的令牌(可选但必要)
当令牌自动刷新后,需要将新的Access Token、过期时间和Refresh Token更新到本地存储,避免下次使用旧令牌:
// 注册令牌刷新回调 refreshTokenCredential.addTokenRefreshCallback(tokenContext -> { AccessToken newAccessToken = tokenContext.getAccessToken(); String newRefreshToken = tokenContext.getRefreshToken(); // 更新account对象的令牌信息 account.setAccessToken(newAccessToken.getToken()); account.setTokenExpiry(Date.from(newAccessToken.getExpiresAt().toInstant())); account.setRefreshToken(newRefreshToken); // 这里添加持久化逻辑,比如保存到数据库或缓存 });
注意事项
- 登录时必须请求
offline_access权限,否则无法获取具备刷新能力的Refresh Token。 - 如果Refresh Token本身过期(通常有效期为90天),
RefreshTokenCredential会抛出AuthenticationException,此时需要引导用户重新完成登录流程。 - 确保应用客户端ID与登录时使用的一致,否则刷新请求会被拒绝。
内容的提问来源于stack exchange,提问作者Petre Popescu
相关产品推荐
相关产品推荐

