使用 OAuth2 身份验证通过 IMAP 连接到 Outlook 时出现问题

问题描述 投票:0回答:1

我们正在构建一个解决方案,通过 IMAP 连接到电子邮件邮箱,获取并存储一些相关电子邮件,以便稍后我们可以在 Web UI 中显示它们。稍后我们计划添加对直接从 Web UI 回复相关电子邮件的支持。

我们已经实现了 OAuth2,用于使用授权代码流通过 OAuth2 身份平台验证与 Outlook 邮箱的 IMAP 连接。它在 2024 年 1 月/2 月使用个人 Outlook 邮箱(来自 outlook.live.com 的邮箱)进行初始测试时可以正常工作,但现在不再工作了。我们还需要它与企业 Outlook 邮箱配合使用,但我们没有测试它是否能在 2024 年 1 月/2 月恢复正常工作。

现在,尝试验证 IMAP 连接到 Outlook 邮箱(甚至是个人邮箱)时会失败。授权代码流程本身工作正常,我们能够毫无问题地获取访问令牌,但这些访问令牌无法按预期工作。

我们收到的错误:

DEBUG IMAP: AUTHENTICATE XOAUTH2 command result: A1 NO AUTHENTICATE failed.

有关我们解决方案的一些技术细节:

  • 它是用 Java 编写的,我们正在使用 Java Mail 库建立 IMAP 连接,获取并存储一些相关电子邮件
  • 我们对 IMAP 使用 SASL XOAUTH2 身份验证机制
  • 我们在 Microsoft Entra ID 中注册了一个应用程序,其设置如下:
    • 支持的帐户类型:任何组织目录中的帐户(任何 Microsoft Entra ID 租户多租户)和个人 Microsoft 帐户(例如 Skype、Xbox)
    • 配置的权限:
      • Microsoft Graph(委托)
        • IMAP.AccessAsUser.All
        • SMTP.发送
        • 用户.阅读
        • 离线访问

在 OAuth2 授权代码流程中,我们请求

IMAP.AccessAsUser.All
SMTP.Send
User.Read
offline_access
范围(没有任何前缀),并使用
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
作为授权端点。

如果我们尝试将范围更改为

https://outlook.office.com/IMAP.AccessAsUser.All
SMTP.Send
User.Read
offline_access
(根据文档此处),则在授权代码流期间预计会失败并出现
invalid_scope
错误。

我们已从此处阅读文档https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by- using-oauth,但它要求使用我们无法再为我们的应用程序配置的已弃用范围(它们不在列表中),文档的后面部分讨论了使用客户端凭据授予流程,这不是我们需要的(我们想代表用户访问邮箱)。

我们希望获得如何使其发挥作用的帮助。预先感谢!

azure-active-directory microsoft-graph-api office365 jakarta-mail imap
1个回答
0
投票

您需要为每个资源使用单独的访问令牌:一个令牌用于 Microsoft Graph(对于

User.Read
),另一个令牌用于 IMAP(对于
IMAP.AccessAsUser.All
)。

  1. Microsoft Graph 权限:User.Read

    范围 URL:https://graph.microsoft.com/User.Read

  2. IMAP 权限:

    IMAP.AccessAsUser.All

    范围 URL:https://outlook.office.com/IMAP.AccessAsUser.All

如果混合使用它们(使用 IMAP 权限的完整 URL),您将遇到

invalid_scope
错误。

仅使用权限而不指定资源(仅使用

IMAP.AccessAsUser.All
)会导致 IMAP 令牌无效(尽管我认为它可以通过 Microsoft Graph 获取用户数据)。

© www.soinside.com 2019 - 2024. All rights reserved.