Azure AD B2C中如何刷新90天生命周期令牌及判断临近过期状态
Azure AD B2C 安卓MSAL开发刷新令牌生命周期处理方案
核心机制说明
首先明确两个有效期的对应逻辑:
- 你观察到的60分钟有效期是访问令牌/ID令牌有效期,MSAL的
profile.getExpiresOn()返回的就是该值,用于判断短期访问令牌是否需要静默刷新 - 90天的是刷新令牌最大生命周期,属于B2C用户流的会话配置,MSAL安卓SDK未公开API直接获取该生命周期的到期时间,因为刷新令牌是不透明凭证,由MSAL内部托管不对外暴露明文属性。
适配离线共享设备场景的落地方案
针对你需要提前提示用户的需求,可通过以下方式实现:
方案1:本地持久化记录生命周期基准时间(最优解)
- 触发时机:用户每次完成交互登录(即调用
acquireToken运行susi用户流成功)、或者调用acquireTokenSilent静默刷新成功时,将当前时间戳持久化存储到本地(如SharedPreferences、本地数据库)。 - 到期判断:每次应用启动/用户操作时,计算当前时间与存储的基准时间的差值,若差值接近你配置的90天生命周期(如提前7天),直接弹出snackbar提示用户联网完成身份验证续期。
- 优化点:可在Azure B2C用户流的「刷新令牌配置」中开启滚动更新策略,只要用户在90天有效期内有过成功的令牌获取操作,刷新令牌生命周期会自动向后顺延90天,对应你本地存储的基准时间也同步更新即可,只要用户不是连续90天完全离线未使用,无需重复交互登录。
方案2:错误捕获兜底
当刷新令牌超过90天生命周期后,调用acquireTokenSilent会返回固定错误码:
- 错误类型为
invalid_grant - 子错误码为
interaction_required或refresh_token_expired
捕获到该错误时,立刻弹窗引导用户走交互登录流程即可。
注意事项
目前MSAL官方未提供直接读取刷新令牌到期时间的接口,你提到的需求确实是常见的离线场景需求,行业内普遍采用本地记录基准时间的方式实现,没有额外兼容问题。
内容的提问来源于stack exchange,提问作者lcj
相关产品推荐
相关产品推荐

