在Angular开发的Office.js插件中真的无法使用Microsoft访问令牌吗?
Office插件Microsoft身份验证可行解决方案
方案1:优先使用官方Office SSO(Office.auth.getAccessToken),解决类型识别与编译问题
- 首先更新Office.js类型包到最新正式版,执行命令:
1.0.250及以上版本的类型包已经正式包含npm install @types/office-js@latest --save-devOffice.auth.getAccessToken的完整类型定义,可解决TypeScript编译报错与智能提示缺失问题。如果更新后仍有识别异常,在项目的全局类型声明文件(如global.d.ts)中补充兜底声明即可:declare global { interface Window { Office: typeof Office & { auth: { getAccessToken: (options?: { allowSignInPrompt?: boolean; allowConsentPrompt?: boolean; forMSGraphAccess?: boolean; }) => Promise<string>; }; }; } } - 必须在插件的
manifest.xml中正确配置WebApplicationInfo节点,填写对应的Azure AD应用客户端ID、资源URI、所需权限范围,这是SSO接口能正常返回令牌的核心前提。 - 调用时补充错误捕获逻辑,当SSO因用户未登录、租户权限限制等场景获取失败时,自动切换到下方的兜底方案。
方案2:兜底兼容方案:displayDialogAsync + MSALv2,解决跨浏览器与桌面端兼容问题
该方案经过多环境验证,可兼容Chrome、Edge、新版Safari,以及Windows、Mac端的桌面Office、网页版Office全场景:
- 触发
Office.context.ui.displayDialogAsync必须放在用户主动交互的同步回调逻辑中(比如按钮点击事件的直接回调),禁止放在异步请求、Promise回调等非同步逻辑中调用,即可避免被Safari的智能跟踪防护功能判定为恶意弹窗而拦截。 - dialog打开的独立页面需和插件主页面同域名,在该独立页面中完整运行MSALv2的身份验证逻辑:该页面不在Office的顶层iframe中,不受iframe的安全策略限制,
acquireTokenSilent、acquireTokenRedirect均可正常运行。 - 独立页面拿到身份令牌后,不要用原生
postMessage回传数据,调用Office官方提供的Office.context.ui.messageParent(令牌内容)方法回传给主插件页面,该方法已经做了跨上下文兼容处理,不会被Safari的跨域通信规则拦截。 - 主插件页面监听dialog的消息事件,拿到令牌后关闭dialog即可正常使用令牌调用相关接口。
内容的提问来源于stack exchange,提问作者wilcotroost
相关产品推荐
相关产品推荐

