【问题标题】:OfficeJS Word Addin | Dialog API's messageParent not working across domains on MACOfficeJS Word 插件 | Dialog API 的 messageParent 不能在 MAC 上跨域工作
【发布时间】:2019-08-22 14:09:17
【问题描述】:

Mac 上的 Microsoft Word 版本:15.29.1 (161215)

让我们假设 OfficeJS Word 插件的以下 IIS 托管设置:

  1. 带有 CNAME addin.xyz.com 的 Word 插件网站
  2. 配置了 CNAME api.xyz.com 和 Google Auth 提供程序的 API 网站。

插件清单

<?xml version="1.0" encoding="UTF-8"?>
<OfficeApp 
      xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 
      xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides"
      xsi:type="TaskPaneApp">

  <Id>07D08B11-F0F4-4BE1-9FE3-7E6648AAEB80</Id>

  <Version>1.0.0.0</Version>
  <ProviderName>xyz</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="xyz" />
  <Description DefaultValue="xyz"/>

  <IconUrl DefaultValue="https://addin.xyz.com/Images/Button32x32.png" />

  <AppDomains>
    <AppDomain>https://api.xyz.com</AppDomain>
    <AppDomain>AppDomain2</AppDomain>
    <AppDomain>AppDomain3</AppDomain>
  </AppDomains>

  <Hosts>
    <Host Name="Document" />
  </Hosts>
  <DefaultSettings>
    <SourceLocation DefaultValue="https://addin.xyz.com/login/index" />
  </DefaultSettings>

  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

我正在按照以下链接中提到的步骤使用 OfficeJS Dialog API 进行插件身份验证:

https://dev.office.com/docs/add-ins/develop/dialog-api-in-office-add-ins#using-the-dialog-apis-in-an-authentication-flow

身份验证流程

  1. Mac 上的 Word 插件通过重定向到对话框中的 getToken API url 来启动身份验证流程:
    var accessToken = {};
    var dlg;
    var messageBanner = null;

    // The initialize function must be run each time a new page is loaded.
    Office.initialize = function (reason) {
        $(document).ready(function () {               
            // Initiate login.
            signIn();
        });
    };

    function signIn() {
        if (Office.context.requirements.isSetSupported('DialogAPI', 1.1)) {
            // Use Office UI methods;
            var signInUrl = "https://api.xyz.com/getToken";
            Office.context.ui.displayDialogAsync(signInUrl,
                { height: 70, width: 40 },
                function (result) {
                    dlg = result.value;
                    dlg.addEventHandler(Office.EventType.DialogMessageReceived, processMessage);
                });
        }
        else {
            // Alternate path
            console.log('DialogAPI not available. Check <Requirements> section in manifest.');
        }
    }

    function processMessage(arg) {
        dlg.close();
        accessToken = JSON.parse(arg.message);
        if (accessToken.token) {                
            window.location.href = '/home/index';
        }
    }
  1. 由于 API 受 Google Auth 保护,它会重定向到对话框内的 Google 登录页面。

  2. 登录成功后,回调 url 即 API 的 getToken url 被调用。

  3. API 生成所需的身份验证令牌并使用 messageParent 方法回调传递令牌的父窗口:

    Office.initialize = function (reason) { 
        Office.context.ui.messageParent(JSON.stringify({ token: <apiToken> }));
    }
  1. 此时,应该调用父窗口(任务窗格)中的处理程序,但是,它没有。在 root 导致时,发现在父窗口中加载的页面来自(子)域,即 addin.xyz.com,这与在子对话框中加载的页面不同,即 api.xyz.com

请注意,上述问题仅在 MAC 上出现,并且在 Windows 上也能正常工作。

【问题讨论】:

  • 你有没有找到任何替代这个限制的方法?

标签: office-js


【解决方案1】:

吉格尼什,

我是新手...但我认为类似的挑战正在努力。

我正在尝试在 Word 加载项中使用 Firebase 进行身份验证。

由于 Word for Windows 使用 IE11(gack!),我的身份验证流程会打开一个 IE11 窗口,该窗口与嵌入式浏览器共享 cookie 等。

但在 Mac 上,任务窗格是 webkit,而不是默认浏览器...请参阅我以前的问题和一个明确的答案:What browser does Office 2016 on Mac use for taskpanes?

我试图避免使用 Office.js 身份验证...只是在我的项目中坚持使用一种方法。

但我不知道如何在我的 Mac Word 2016 任务窗格中停止触发默认浏览器的身份验证流程,这与包含我的任务窗格的嵌入式 webkit 视图有关。

【讨论】:

    【解决方案2】:

    由于当前 MAC 实现中的安全问题,我们对 messageParent 的限制是“调用此 API 的页面必须与父级位于同一域中”。 https://dev.office.com/reference/add-ins/shared/officeui.messageparent

    在您的示例中,它们位于不同的域中(尽管在同一个子域中),这就是它失败的原因。

    【讨论】:

    • 这是 MAC OS 的限制,将来可能会得到解决?在这种情况下,您为插件推荐什么解决方案?
    • 补充易说的内容。根据文档,任何调用 messageParent 的页面都必须与父页面位于同一域中。建议的方法是让初始页面和结束页面与调用 displayDialog 方法的页面位于同一域中。 dev.office.com/reference/add-ins/shared/…
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2011-09-27
    • 2022-10-17
    • 1970-01-01
    • 2013-01-11
    • 2013-02-24
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多