将 OAuth 2.0 与 Exchange Web 服务结合使用

Use of OAuth 2.0 with Exchange Web Services

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

我希望我可以采用与在 Graph 应用程序中相同的方式生成的令牌,并将其输入到我的 EWS 调用中的“Authorization: bearer ...”header http调用。 (我没有使用 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 调用的授权 header 中使用此令牌失败并出现 http 401。但是,在 Graph 调用中使用相同的令牌是可行的。我确实尝试用“”https://outlook.office365.com/.default”替换范围,但它产生了相同的结果。

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

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

更新:我确实继续添加了所有“Legacy Exchange”API 权限,以及 re-authorized 我的应用程序测试租户。仍然没有运气。我正在尝试执行“GetFolder”EWS API。只有 graph.microsoft.com 作用域才能获取令牌,所以这可能需要更改?

我建议你从 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 . You can check the token your generating in https://jwt.io/ 。例如,受众应该是 outlook.office365.com,范围应该是 full_access_as_app.

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

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