OfficeJS Word 插件 |对话框 API 的 messageParent 在 MAC 上无法跨域工作

OfficeJS Word Addin | Dialog API's messageParent not working across domains on MAC

Microsoft Word MAC 版本:15.29.1 (161215)

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

  1. 带有 CNAME 的 Word Addin 网站 addin.xyz.com
  2. API 配置了 CNAME api.xyz.com 和 Google 身份验证提供商的网站。

插件清单

<?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>

我正在按照下面 link 中提到的步骤使用 OfficeJS 对话框 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 生成所需的身份验证令牌和回调父 window 使用 messageParent 方法传递令牌:

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

请注意,上述问题仅在 MAC 上出现,并且在 Windows 上被发现。

吉涅什,

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

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

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

但是在 Mac 上,任务窗格是 webkit,而不是默认浏览器...请参阅我之前的一个问题和一个知识渊博的答案:

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

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

由于当前 MAC 实施中的安全问题,我们对 "The page calling this API must be on the same domain as the parent." https://dev.office.com/reference/add-ins/shared/officeui.messageparent

的 messageParent 有限制

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