Angular中MSAL v1调用acquireTokenSilent未返回新令牌问题
MSAL v1 acquireTokenSilent 返回旧令牌问题解决方案
MSAL v1的本地令牌缓存默认有5分钟的提前续期偏移量,即令牌实际到期前5分钟,MSAL就会判定令牌即将过期、触发续期;你设置的是剩余2分钟才调用续期方法,此时MSAL仍然认为当前缓存的令牌属于有效区间,会直接返回旧令牌而非发起新的申请。
可行解决步骤
- 调整MSAL全局的续期偏移配置:初始化MSAL时修改
tokenRenewalOffsetSeconds参数,设置为小于120的数值(比如60,代表提前1分钟判定令牌过期),这样你在剩余2分钟触发续期时,MSAL会主动发起新的令牌申请,示例初始化配置片段:const msalConfig = { auth: { clientId: CLIENTID, // 其余auth配置 }, cache: { cacheLocation: "localStorage", storeAuthStateInCookie: true }, system: { tokenRenewalOffsetSeconds: 60 // 调整续期偏移为60秒 } } - 给acquireTokenSilent请求添加强制刷新参数:在请求对象中增加
forceRefresh: true,强制跳过本地缓存直接向身份提供商请求新令牌,修改后的renewToken代码如下:renewToken(){ const renewIdTokenRequest = { scopes: [CLIENTID, 'openid', 'profile'], // 补充必要的OIDC scope,和首次申请令牌时的scope保持完全一致 forceRefresh: true // 强制跳过缓存拉取新令牌 }; this.msalService.acquireTokenSilent(renewIdTokenRequest).then(re=>{ console.log('新令牌响应', re) // 可通过re.expiresOn或者解码re.idToken.rawIdToken的exp字段验证令牌是否更新 }) } - 校验触发逻辑的时间计算是否准确:确认你判断令牌剩余2分钟到期的逻辑,是读取MSAL缓存中令牌的实际
expiresOn属性计算,而非自行存储的令牌到期时间,避免时间差导致触发时机不符合预期。
内容的提问来源于stack exchange,提问作者Hiren Nakrani
相关产品推荐
相关产品推荐

