Office插件MSAL单点登录(SSO):如何刷新访问令牌?
Office插件SSO令牌过期监控与刷新方案
你的思路是对的,每次调用API前调用OfficeRuntime.auth.getAccessToken()是Office插件场景下最稳妥的令牌管理方式,下面针对你的问题逐一拆解:
1. OfficeRuntime.auth.getAccessToken()的自动缓存与刷新逻辑
这个API是微软专门为Office插件SSO场景设计的,内部已经封装了完整的令牌生命周期管理:
- 调用时会优先检查Office Runtime维护的本地缓存,判断令牌是否处于有效期内(包含预留缓冲时间,避免令牌在请求过程中过期)。
- 如果缓存中的令牌已过期或即将失效,它会自动向Azure AD发起刷新请求,无需你手动解析令牌的
exp字段或监控过期时间。 - 缓存由Office Runtime负责维护,你不需要额外实现缓存校验、过期清理等逻辑。
2. On-Behalf-Of(OBO)流令牌的处理
通过OBO流换取的自有API令牌,需要你自行管理其生命周期:
- 解析OBO令牌的
exp字段,记录过期时间戳; - 在HTTP拦截器中,先判断自有API令牌是否过期:
- 未过期:直接将令牌加入请求头发起API调用;
- 已过期:先调用
OfficeRuntime.auth.getAccessToken()获取最新的用户令牌,再通过OBO流换取新的自有API令牌,之后再发起请求。
- 若你的API调用频率不高,也可以跳过本地缓存校验,每次调用API前都重新执行OBO流换取令牌——OBO流本身性能开销较低,不会对接口响应速度造成明显影响。
3. 为何常规MsalService无法在Office插件中使用
Office插件运行在Office沙箱环境中,和普通Web应用的浏览器环境存在差异:
- MsalService依赖浏览器的会话存储、跳转授权流程等特性,而Office沙箱对这些操作有严格限制;
OfficeRuntime.auth.getAccessToken()是适配沙箱环境的专用API,会通过Office客户端完成授权流程,避免了沙箱的限制问题。
实践建议
- 封装HTTP拦截器:将
getAccessToken()调用、OBO流换取令牌的逻辑统一放在拦截器中,所有API请求自动触发令牌校验与刷新,避免重复代码; - 异常处理:捕获
getAccessToken()可能抛出的错误(如用户拒绝授权、网络异常),并在插件中给出对应的提示,提升用户体验。
内容的提问来源于stack exchange,提问作者JimbobTheSailor
相关产品推荐
相关产品推荐

