OAuth 代表用户访问 EWS

OAuth access to EWS on behalf of a user

我在使用管理员权限时成功地将 OAuth 2.0 与 EWS 结合使用。现在我正在尝试设置它,以便单个用户可以登录并为自己授予访问权限。所以我用这个 URL:

启动浏览器
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=f3f92d23-29dd-4465-828e-35300884ef61&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&response_type=code&scope=offline_access%20Calendars.ReadWrite.All%20Contacts.ReadWrite.All%20Mail.ReadWrite.All%20Tasks.ReadWrite%20User.ReadBasic.All

浏览器允许我登录我的测试账户,但随后返回此错误:

error=无效的客户端 description=AADSTS650053 应用程序 'my app name' 要求范围 'Calendars.ReadWrite.All' 资源“00000003-0000-0000-c000-000000000000”上不存在

在 Azure 中,查看我的应用程序的 API 权限时,我有 11 个 Exchange 权限,包括 Calendars.ReadWrite.All 的应用程序和委派权限,此外还有我的所有其他权限请求。

这是怎么回事?

因为 EWS 是遗留的 API,所以它没有实施 Graph 和 Outlook REST API 使用的更严格的权限模型。唯一适用于委托访问的权限是 EWS.AccessAsUser.All(范围 https://outlook.office.com/EWS.AccessAsUser.All)。这提供了对邮箱中每个文件夹的完全访问权限(以及用户已被授予访问权限的任何邮箱)。看起来您的应用程序注册已经包含该权限,所以

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=f3f92d23-29dd-4465-828e-35300884ef61&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&response_type=code&scope=offline_access%20https%3A%2F%2Foutlook.office.com%2FEWS.AccessAsUser.All

应该可以