You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:25:39