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 插件设置:
- 带有 CNAME 的 Word Addin 网站 addin.xyz.com
- 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 进行插件身份验证:
身份验证流程
- 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';
}
}
由于 API 受 Google Auth 保护,它重定向到对话框内的 Google 登录页面。
成功登录后,回调 url 即 API 的 getToken url 被调用。
API 生成所需的身份验证令牌和回调父 window 使用 messageParent 方法传递令牌:
Office.initialize = function (reason) {
Office.context.ui.messageParent(JSON.stringify({ token: <apiToken> }));
}
- 此时,父 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 有限制
在您的示例中,它们位于不同的域中(尽管位于同一子域中),这就是它失败的原因。
Microsoft Word MAC 版本:15.29.1 (161215)
让我们假设以下 IIS 托管 OfficeJS Word 插件设置:
- 带有 CNAME 的 Word Addin 网站 addin.xyz.com
- 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 进行插件身份验证:
身份验证流程
- 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';
}
}
由于 API 受 Google Auth 保护,它重定向到对话框内的 Google 登录页面。
成功登录后,回调 url 即 API 的 getToken url 被调用。
API 生成所需的身份验证令牌和回调父 window 使用 messageParent 方法传递令牌:
Office.initialize = function (reason) {
Office.context.ui.messageParent(JSON.stringify({ token: <apiToken> }));
}
- 此时,父 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 有限制在您的示例中,它们位于不同的域中(尽管位于同一子域中),这就是它失败的原因。