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

Excel for Mac 16.1升级后任务窗格插件window.open打开空白窗口求助

针对Excel for Mac 16.1+的SSO认证替代方案

我之前在适配Excel Mac插件的时候也踩过window.open的坑,给你几个针对SSO和跨域认证场景的可行方案,亲测有效:

  • 优先使用Office.js官方Dialog API
    这是微软专门为Office插件设计的弹出窗口方案,完美适配Mac版本的安全限制,而且天然支持SSO流程中的跨域重定向。实现步骤如下:

    1. 调用Office.context.ui.displayDialogAsync打开你的登录页面,开启事件传播权限;
    2. 登录完成(包括跳转到未在manifest中配置的认证域名)后,在回调页面通过messageParent方法把认证凭证(如token)传递回插件主页面;
    3. 记得在manifest的<AppDomains>里添加登录完成后跳转回的业务域名,确保Dialog能正常完成通信。

    示例代码:

    // 主页面打开登录Dialog
    Office.context.ui.displayDialogAsync('/login.op', {
      height: 50,
      width: 50,
      allowEventPropagation: true
    }, function(result) {
      const dialog = result.value;
      // 监听Dialog返回的消息
      dialog.addEventHandler(Office.EventType.DialogMessageReceived, function(args) {
        const authToken = args.message;
        dialog.close();
        // 这里处理拿到token后的业务逻辑
      });
    });
    
    // 登录成功后的回调页面发送消息
    Office.context.ui.messageParent(JSON.stringify({ token: 'your_auth_token' }));
    

    这个方案的优势是完全符合Office插件的安全模型,不管Mac还是Windows版本都能稳定运行,中间的认证跳转域名不需要提前配置到manifest里。

  • 尝试将认证域名加入manifest的AppDomains
    如果你的SSO服务的认证域名是固定的(比如Azure AD的login.microsoftonline.com),可以把这些域名添加到manifest的<AppDomains>节点中,这样window.open可能就能正常加载认证页面了。不过这个方法只适用于你能提前知晓所有跳转域名的场景,动态域名就不适用了。

    示例manifest配置片段:

    <AppDomains>
      <AppDomain>https://login.your-sso-provider.com</AppDomain>
      <AppDomain>https://your-main-app-domain.com</AppDomain>
    </AppDomains>
    
  • 隐式授权流配合iframe(备选方案)
    如果你不想用Dialog API,可以尝试把认证流程放在隐藏的iframe中,通过postMessage和主页面通信。但要注意,有些SSO服务会设置X-Frame-Options阻止页面嵌入,所以需要先确认你的认证服务商允许这种方式。

    核心思路代码:

    // 创建隐藏的认证iframe
    const authIframe = document.createElement('iframe');
    authIframe.style.display = 'none';
    // 这里替换成你的SSO隐式授权地址
    authIframe.src = '/login.op?response_type=token&client_id=your_client_id&redirect_uri=your_callback_uri';
    document.body.appendChild(authIframe);
    
    // 监听iframe返回的认证消息
    window.addEventListener('message', function(event) {
      // 验证消息来源的合法性
      if (event.origin === 'your_callback_uri_domain') {
        const authData = JSON.parse(event.data);
        const token = authData.token;
        // 处理凭证后移除iframe
        document.body.removeChild(authIframe);
      }
    });
    

总体来说,最稳妥的还是第一个方案——Office.js Dialog API,毕竟是官方针对Office插件认证场景设计的,兼容性和稳定性都有保障。

内容的提问来源于stack exchange,提问作者agradl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:26:53