oauth-2.0 - 将 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 范围可以获取令牌,所以可能需要更改?
解决方案
对于 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>
推荐阅读
- python - 我正在尝试通过上部函数在python的密码生成器中生成两个大写字母,但它不起作用
- informatica - 从 IICS(Informatica 信息云服务)连接 Planview
- regex - 如何在 Powershell 中添加换行符和反向引用
- pdf - 使用 Ghostscript 创建可访问的 PDF 文件
- python - 为什么未定义从其他函数返回“函数”调用的函数
- javascript - 赛普拉斯:不能在模块外使用 import 语句
- amazon-web-services - AWS Stepfunction:定义(前缀)-从另一个 Stepfunction 调用时的名称
- regex - 如何在第一个逗号后拆分第一个竖线上的字符串?
- java - 为以下代码的每个循环/流获取等效项
- azure-active-directory - 我可以使用 azure-sdk-for-js 处理 Azure 活动目录吗