Outlook外接程序向ewsURL发起请求时触发CORS跨域错误如何解决
问题原因
- Office 365 EWS 接口默认未对外放开跨域访问权限,浏览器同源策略会拦截前端直接发起的跨域请求,这和你是否配置外接程序清单的
AppDomains节点无关:AppDomains的作用仅为允许外接程序跳转/嵌入指定域名的页面,无法解除浏览器对第三方接口的跨域限制。 - Postman属于桌面客户端,不受浏览器同源策略约束,因此可以正常请求得到响应,该测试结果无法代表浏览器场景的可行性。
解决方案
方案1:使用官方提供的makeEwsRequestAsync接口(优先推荐)
Office.js 专门封装了EWS请求接口,走Office客户端原生通道发送请求,完全规避CORS问题,无需手动处理Token和请求头,示例代码如下:
var envelope = getSoapEnvelope(Office.context.mailbox.item.itemId); Office.context.mailbox.makeEwsRequestAsync(envelope, function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { // 处理响应结果 result.value } else { // 处理错误 } });
使用该接口需要提前在外接程序清单中配置对应EWS操作的权限,例如读取邮件项需配置ReadItem级别的权限。
方案2:通过后端服务代理转发请求
如果有自定义请求逻辑的需求,可以自行搭建后端转发服务:
- 前端将EWS请求参数发送到你自己的后端接口
- 后端服务收到请求后,携带Token转发到EWS接口
- 后端将EWS返回的结果回传给前端
后端服务不受浏览器同源策略限制,同时你可以在自己的后端接口配置CORS规则,允许你的https://myorg.github.io域名访问即可。
注意事项
不要尝试使用JSONP、代理浏览器插件等非常规方式绕过CORS,前者不适用于EWS的SOAP POST请求场景,后者仅能用于本地测试,无法对外交付使用。
内容的提问来源于stack exchange,提问作者Dmytro Pastovenskyi
相关产品推荐
相关产品推荐

