Имеет надстройку Office для Outlook Web. Мне нужно реализовать логин логина c для внешнего сервиса с помощью следующих шагов:
- Показать мою страницу (шлюз. php) в отдельном окне
- Перенаправить на аутентификацию внешнего сервиса page
- Перенаправление на мою страницу, получение кода аутентификации и уведомление родительского приложения.
Использование документов из MS Dev Center Аутентификация и авторизация с помощью диалогового окна Office API и Использование диалогового API Office в надстройках Office
И надстройка, и шлюз. php страницы находятся в одном домене / субдомене. Домены приложений в манифесте обновлены. HTTPS используется. Нет пользовательских портов. Это не localhost.
Проблемы возникают на этапе 3: диалоговое окно просто закрывается без каких-либо уведомлений или ошибок после его перенаправления обратно со страницы аутентификации внешней службы. Событие Office.EventType.DialogEventReceived перехватывается в родительском окне, но с кодом ошибки 12006 «Диалог закрыт пользователем». Пока ожидается Office.EventType.DialogMessageReceived. После некоторой отладки кажется, что следующий код из библиотеки . 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 должны.
Спасибо