首页 > 解决方案 > 将 OAuth 2.0 与 Exchange Web 服务结合使用

问题描述

我想澄清一下 OAuth 2.0 是否或在多大程度上可以与 EWS 应用程序一起使用。这是我的情况:我维护一个访问 Office 365 数据的应用程序。它使用 EWS 和基本身份验证。为了响应不再支持基本身份验证和弃用 EWS 的计划,我开发了一个使用 Microsoft Graph 和 OAuth 2.0 的新版本的应用程序。我没有问题让 OAuth 工作。但是 Graph 仍然存在一些重大缺陷(对于我们的需要),所以我现在想做的是在我们原来的 EWS 应用程序中支持 OAuth。

我希望我可以像在 Graph 应用程序中那样获取一个生成的令牌,并将其提供给我的 EWS 调用中的 http 调用的“Authorization:bearer ...”标头。(我没有使用 EWS 托管 API 或任何类型的身份验证库,只是使用 libcurl 进行直接 http 调用)。不幸的是,这会导致 http 错误 401 Unauthorized。

这是我获取令牌的方式:

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

有数据:

client_id={client_id}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret={client_secret}&grant_type=client_credentials

这会产生 http 200 和返回的令牌:

eyJ0eXAiOiJKV1QiLCJub25jZSI6...

正如我所说,在 EWS 调用的 Authorization 标头中使用此令牌会因 http 401 而失败。但是,将相同的令牌与 Graph 调用一起使用是可行的。我确实尝试用“”https://outlook.office365.com/.default”替换范围,但它产生了相同的结果。

我在 Azure 门户中查看了授予我的应用程序的 API 权限。它们都是 Microsoft Graph 类型。我没有看到任何可供请求的“EWS”权限。这可能是我的问题吗?

对此问题的任何帮助将不胜感激,谢谢。

更新:我确实继续添加了所有“Legacy Exchange”API 权限,并为我的测试租户重新授权了该应用程序。仍然没有运气。我正在尝试执行“GetFolder”EWS API。只有 graph.microsoft.com 范围可以获取令牌,所以可能需要更改?

标签: oauth-2.0microsoft-graph-apiexchangewebservices

解决方案


我建议您从https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth开始

对于 EWS,如果您使用的是客户端凭据授权(这是您在示例中使用的),那么唯一有效的权限是 full_access_as_app,它位于旧版 Exchange 应用程序权限下。您需要使用的范围是https://outlook.office365.com/.default您可以在https://jwt.io/中检查您生成的令牌。例如,Audience 应该是 outlook.office365.com,范围应该有 full_access_as_app。

您需要在 EWS 代码中做的最后一件事是将 EWS 模拟标头设置为您要模拟(或访问)的邮箱,例如

<soap:Header>
  <t:ExchangeImpersonation>
    <t:ConnectingSID>
      <t:PrimarySmtpAddress>alisa@contoso.com</t: PrimarySmtpAddress>
    </t:ConnectingSID>
  </t:ExchangeImpersonation>
</soap:Header>


推荐阅读