使用angular-oauth2-oidc登录后hasValidAccessToken始终返回true问题求助
问题根因
你遇到的是angular-oauth-oidc 12.1.0版本的常见问题,核心有两个原因:
- 配置未开启会话状态校验和令牌过期缓冲校验,库默认不会主动清理已过期的本地存储令牌,导致
hasValid*方法读取到旧令牌后错误返回有效状态 - 12.1.0版本本身存在令牌过期校验逻辑的已知bug,部分场景下不会正确对比当前时间与令牌的
exp字段
修复步骤
1. 补充配置项
在你的authCodeFlowConfig中新增以下配置:
export const authCodeFlowConfig: AuthConfig = { // 保留你原有配置不变,新增以下内容 sessionChecksEnabled: true, // 开启会话状态校验,自动检测令牌过期 expiryGracePeriodInSeconds: 30, // 提前30秒判定令牌过期,避免网络请求时刚好过期的问题 clearHashAfterLogin: true, // 登录后清理地址栏的授权码参数,避免重复校验异常 // 如果需要使用自动刷新令牌功能,修改scope如下,同时需要在Keycloak对应客户端配置中开启「允许离线访问」开关 // scope: 'openid profile email offline_access', };
2. 补充初始化逻辑
在初始化库的then回调中新增自动刷新令牌的配置:
ngOnInit(): void { this.oauthService.configure(authCodeFlowConfig); this.oauthService.loadDiscoveryDocumentAndTryLogin().then(() => { // 新增:开启自动静默刷新令牌,过期前会自动换发新令牌 this.oauthService.setupAutomaticSilentRefresh(); if (this.oauthService.hasValidAccessToken()) { this.router.navigate(['home']); } else { this.oauthService.initCodeFlow(); } }); }
3. (可选)切换库版本
如果以上配置修改后问题仍然存在,说明你触发了12.1.0版本的已知校验bug,可以将angular-oauth-oidc版本切换到12.0.1或者12.2.0稳定版,这两个版本不存在该校验问题。
4. (可选)自定义兜底校验逻辑
如果不想修改版本,你可以在路由守卫中新增自定义令牌校验逻辑作为兜底,避免库的方法返回错误结果:
canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const accessToken = this.oauthService.getAccessToken(); const hasValidToken = this.isTokenValid(accessToken); if (!hasValidToken) { console.log('AuthGuard: Token not valid'); // 清理无效的旧令牌,避免后续重复判断错误 this.oauthService.logOut(); this.router.navigate(['landing']); } else { console.log('AuthGuard: Valid token'); } return hasValidToken; } // 自定义令牌校验方法 private isTokenValid(token: string): boolean { if (!token) return false; const tokenParts = token.split('.'); if (tokenParts.length !== 3) return false; try { const payload = JSON.parse(window.atob(tokenParts[1])); const currentUnixTime = Math.floor(Date.now() / 1000); // 保留30秒缓冲时间 return payload.exp > currentUnixTime + 30; } catch (err) { return false; } }
内容的提问来源于stack exchange,提问作者Jucaalpa
相关产品推荐
相关产品推荐

