OfficeJS Word Addin | Dialog API的messageParent无法在MAC上跨域工作

时间:2016-12-26 11:01:19

标签: office-js

MAC版本的Microsoft Word:15.29.1(161215)

我们假设以下是IIS托管的OfficeJS Word Addin设置:

  1. 使用CNAME addin.xyz.com
  2. 的Word Addin网站
  3. API网站,其中包含CNAME api.xyz.com 和Google身份验证提供程序。
  4. Addin Manifest

    <?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进行Addin身份验证,遵循以下链接中提到的步骤:

    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 Addin通过在对话框中重定向到getToken API网址来启动身份验证流程:

      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';
          }
      }
      
    2. 由于API受Google Auth保护,因此会重定向到对话框内的Google登录页面。

    3. 成功登录后,将调用回调网址,即API的getToken网址。

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

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

    6. 请注意,上述问题仅在MAC上发生,并且发现在Windows上运行。

2 个答案:

答案 0 :(得分:1)

Jignesh,

我对此很陌生......但是我在努力思考类似的挑战。

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

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

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

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

但我无法弄清楚如何在我的Mac Word 2016任务窗格中停止启动默认浏览器的auth流程,这与包含我的任务窗格的嵌入式webkit视图有关。

答案 1 :(得分:1)

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

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