具有适用于 Outlook Online 的 Office 加载项。我需要通过以下步骤实现外部服务的登录逻辑:
- 在单独的窗口中显示我的页面(gateway.php)
- 重定向到外部服务认证页面
- 重定向回我的页面,检索身份验证代码并通知父应用程序。
使用 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 上创建的问题。
谢谢