Office 365对接Microsoft Graph时原有EWS授权Token无法访问问题
问题根因
你通过Office.context.mailbox.getCallbackTokenAsync默认获取的访问令牌,受众(aud声明)为EWS服务地址,和Microsoft Graph要求的https://graph.microsoft.com受众不匹配,所以直接复用该令牌调用Graph接口会返回401未授权错误,和你初始化GraphServiceClient的代码逻辑无关。
可行解决方案
方案1:前端直接获取Graph专属令牌(改造成本最低)
仅需调整客户端取令牌的逻辑,服务端代码无需修改:
- 确认你的Office加载项使用的是Outlook API v1.13及以上版本,仅该版本及之后支持自定义令牌受众
- 替换原有的令牌获取代码,显式指定受众为Graph:
Office.context.mailbox.getCallbackTokenAsync({ authOptions: { audience: "https://graph.microsoft.com" } }, function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { const graphAccessToken = result.value; // 将该令牌传递到你的Web服务端即可调用Graph接口 } });
- 服务端直接使用新获取的Graph令牌初始化
GraphServiceClient即可,你原有的服务端代码逻辑无需调整。
方案2:兼容低版本Outlook,使用On-Behalf-Of流兑换令牌
如果你的插件需要兼容不支持v1.13 API的低版本Outlook,可以通过令牌兑换的方式实现:
- 首先在Azure AD应用注册中,给你的应用新增
https://outlook.office365.com/user_impersonation委托权限,同时确认所需的Graph权限均已配置并完成管理员同意 - 服务端接收客户端传递的原始EWS令牌后,向Azure AD令牌端点发起On-Behalf-Of流请求,将EWS令牌兑换为受众为
https://graph.microsoft.com的访问令牌 - 用兑换后的令牌初始化
GraphServiceClient调用接口即可。
验证要点
- 确认插件Manifest中配置的权限等级(如
ReadWriteMailbox)和你调用的Graph接口所需权限匹配 - 可以用jwt解析工具查看获取到的令牌,检查
aud声明是否为https://graph.microsoft.com,且scp声明包含你需要的接口权限
内容的提问来源于stack exchange,提问作者lfdevjmp
相关产品推荐
相关产品推荐

