我们假设以下是IIS托管的OfficeJS Word Addin设置:
<?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身份验证,遵循以下链接中提到的步骤:
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';
}
}
由于API受Google Auth保护,因此会重定向到对话框内的Google登录页面。
成功登录后,将调用回调网址,即API的getToken网址。
API使用messageParent方法生成所需的身份验证令牌和回调父窗口传递令牌:
Office.initialize = function (reason) {
Office.context.ui.messageParent(JSON.stringify({ token: <apiToken> }));
}
此时,应调用父窗口(taskpane)中的处理程序,但事实并非如此。在root导致时,发现父窗口中加载的页面来自(子)域,即addin.xyz.com,这与子对话框中加载的页面不同,即api.xyz.com
请注意,上述问题仅在MAC上发生,并且发现在Windows上运行。
答案 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
在您的示例中,它们位于不同的域中(尽管在相同的子域中),这就是它失败的原因。