0

具有适用于 Outlook Online 的 Office 加载项。我需要通过以下步骤实现外部服务的登录逻辑:

  1. 在单独的窗口中显示我的页面(gateway.php)
  2. 重定向到外部服务认证页面
  3. 重定向回我的页面,检索身份验证代码并通知父应用程序。

使用 MS 开发中心的文档使用 Office 对话框 API 进行身份验证和授权,在 Office 加载项中使用 Office 对话框 API

加载项和 gateway.php 页面都在同一个域/子域中。清单中的 AppDomains 已更新。使用 HTTPS。没有自定义端口。它不是本地主机。

问题出现在第 3 阶段:对话窗口在从外部服务身份验证页面重定向回来后简单地关闭,没有任何通知或错误。事件 Office.EventType.DialogEventReceived 在父窗口中被捕获,但错误代码为 12006“用户关闭对话框”。而 Office.EventType.DialogMessageReceived 是预期的。经过一些调试后,office.js库中的下一个代码似乎是负责任的:

var initialize = function OSF__OfficeAppFactory$initialize() {
    _retrieveHostInfo();
    _retrieveLoggingAllowed();
    if (_hostInfo.hostPlatform == "web" && _hostInfo.isDialog && window == window.top && window.opener == null) {
        window.open('', '_self', '');
        window.close(); //<--- this what closes my window
    }

原因是由于重定向到外部服务页面(在我的域之外),window.opener为空。:(而且我根本找不到它在我的情况下应该如何工作。

重定向后我的页面非常简单——只是 Office 的一个脚本,但它甚至从未到达过。页面关闭得更早。

<html>
<head>
   <script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.debug.js"></script>
</head>
<body>

<script lang="js" type="text/javascript">   
  if (typeof Office !== 'undefined'){
        Office.onReady(info => {
                const messageObject = {message: "CODE_FROM_GET_PARAM"};
                const jsonMessage = JSON.stringify(messageObject);
                Office.context.ui.messageParent(jsonMessage);
      });
    } else {
        console.warn("Office failed");
    }
    </script>
</body>

</html>

对于在我的域内进行重定向的情况——一切正常。家长收到通知,没有任何问题。

在重定向到外部域的情况下它应该如何工作有什么想法吗?它应该基于使用 Office 对话框 API 进行身份验证和授权

已编辑:链接到 Github 上创建的问题。

谢谢

4

0 回答 0