Office 365插件共享邮箱中getCallbackTokenAsync调用失败求助
getCallbackTokenAsync返回9018错误的解决方案 问题重现
在Office 365 Outlook Web插件中调用Office.context.mailbox.getCallbackTokenAsync时,普通收件箱可正常获取令牌,但共享收件箱返回以下错误:
OSF.DDA.Error {name: 'GenericTokenError', message: 'An internal error has occurred.', code: 9018}
核心代码片段:
Office.context.mailbox.getCallbackTokenAsync( { isRest: true }, (result: any) => { if (result.status === "succeeded") { var accessToken = result.value; console.log(accessToken); this.getWebUrl() .then((itemId) => { // 后续业务逻辑 }); } else { reject(result); } } );
核心问题解答
1. 近期getCallbackTokenAsync更新是否影响共享收件箱行为?
Office 365 Outlook插件API的常规更新未针对共享收件箱场景做破坏性变更,但如果插件清单未遵循最新权限声明规范,可能触发兼容性问题。目前官方文档未提及该API针对共享收件箱的功能调整,优先排查权限与配置问题。
2. 访问共享邮箱是否需要特定权限或配置?
是,共享收件箱场景需满足以下要求:
- 插件清单权限:插件必须声明至少
ReadMailbox权限,推荐使用ReadWriteMailbox,需在manifest.xml的VersionOverrides节点中正确配置:<VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="VersionOverridesV1_0"> <!-- 其他配置项 --> <Permissions>ReadWriteMailbox</Permissions> </VersionOverrides> - 共享邮箱权限:当前登录用户必须拥有共享邮箱的完全访问权限,或至少拥有发送为/代表发送权限,且已将共享邮箱添加到Outlook客户端(Web/桌面)中。
- 身份验证方式:租户需启用现代身份验证,基本身份验证在共享邮箱场景下可能导致令牌获取失败。
解决方案与排查思路
替换为推荐API:
getAccessTokenAsync
微软已逐步弃用getCallbackTokenAsync,推荐使用getAccessTokenAsync,该API对共享邮箱的支持更稳定,权限控制更清晰。替换后的代码示例:Office.context.mailbox.getAccessTokenAsync({ permissions: "Mailbox.ReadWrite" }, (result) => { if (result.status === "succeeded") { const accessToken = result.value; // 调用Graph API或Outlook REST API } else { console.error("令牌获取失败:", result.error); } });验证共享邮箱权限配置
联系租户管理员确认:- 用户对目标共享邮箱拥有「完全访问」权限
- 共享邮箱未被设置为隐藏或限制访问
检查插件清单权限声明
确保插件清单中的权限与实际需求匹配,避免权限不足。重新部署插件并清除Outlook缓存,确保配置生效。排查API版本兼容性
使用Office.context.mailbox.diagnostics.hostVersion获取当前Outlook版本,确保后续调用的REST API版本与令牌兼容(推荐使用v2.0版本的Outlook REST API或Microsoft Graph API)。查看详细错误日志
在Outlook Web版的开发者工具中查看网络请求的详细响应,或在Office 365管理中心的审核日志中查找权限拒绝记录,定位具体错误原因。
内容的提问来源于stack exchange,提问作者Sahana R

