Office JS API获取AccessToken报错13001问题求助
解决Office JS获取AccessToken时报13001(用户未登录)的问题
我来帮你捋捋这个问题哈,结合你的代码和混合AD架构的场景,主要有几个核心问题需要调整:
1. 对话框与主加载项的上下文不共享
你现在是在主加载项的ExecuteFunction上下文里调用getAccessTokenAsync,但后续打开的对话框是独立的iframe上下文——这俩的登录状态是完全分开的!而且你说所有敏感操作都要在对话框里执行,那根本不该在主加载项里提前调用token获取逻辑,应该把getDataWithToken移到对话框页面的代码里,让对话框自己初始化Office并获取token,主加载项只负责打开对话框就行。
2. 混合AD架构的身份验证适配
你们用的是本地AD同步到云的混合架构,这种场景下Office JS的auth模块容易出现身份源识别混乱的问题。你可以在调用getAccessTokenAsync时,强制指定租户ID的权限验证地址,避免自动检测出错:
getDataWithToken({ forceConsent: false, authority: "https://login.microsoftonline.com/你的租户ID" });
把你的租户ID换成你们公司Azure AD的实际租户ID,这样就能让验证流程精准指向你们的混合身份体系。
3. 错误处理逻辑要对应上下文
你当前收到13001错误时,是在主加载项上下文里调用forceAddAccount: true,但这根本解决不了对话框的登录问题!得把错误处理移到对话框内部——当对话框里的getAccessTokenAsync报错时,再在对话框的上下文里触发添加账户操作,这样才能让对话框获取到正确的登录状态。
4. 调整后的代码示例
主加载项的showDialog函数(仅负责打开对话框)
function showDialog() { Office.context.ui.displayDialogAsync('https://localhost:3000/PluginApp/index.html', { height: 80, width: 80, displayInIframe: true}, function(asyncResult) { if (asyncResult.status === "succeeded") { const dialog = asyncResult.value; // 可选:监听对话框的消息回调 dialog.addEventHandler(Office.EventType.DialogMessageReceived, function(args) { console.log("从对话框收到数据:", args.message); }); } else { console.error("打开对话框失败:", asyncResult.error.message); } }); }
对话框页面的脚本(负责初始化和获取token)
// 对话框加载完成后先初始化Office Office.initialize = function() { getDataWithToken({ forceConsent: false }); }; function getDataWithToken(options) { Office.context.auth.getAccessTokenAsync(options, function (result) { if (result.status === "succeeded") { // 在这里调用Microsoft Graph获取敏感数据 console.log("成功获取AccessToken:", result.value); } else { handleDialogErrors(result); } }); } function handleDialogErrors(result) { switch (result.error.code) { case 13001: // 在对话框上下文里触发添加账户操作 getDataWithToken({ forceAddAccount: true }); break; default: console.error("Token获取失败:", result.error.message); } }
额外检查点
- 确保manifest里的
WebApplicationInfo配置正确:Client ID、权限范围(比如Mail.Read、User.Read)都要和Azure AD里注册的加载项一致,且已经完成权限授予。 - 混合架构下,确认本地AD同步到云的用户UPN(用户主体名称)和Outlook Online登录的账户完全匹配,否则会出现身份验证不匹配的问题。
内容的提问来源于stack exchange,提问作者pandemic
相关产品推荐
相关产品推荐

