"The tenant for tenant guid ... does not exist" 使用客户端凭据流(守护程序)访问 Microsoft Graph 时 API

"The tenant for tenant guid ... does not exist" when using client credentials flow (daemon) to access Microsoft Graph API

我想定期从控制台应用程序访问 Microsoft Graph,以便将邮件从 Outlook 邮箱复制到数据库。 为了以编程方式进行身份验证,我不得不使用 Microsoft Graph 的 "Client Credentials Flow".

这些是我必须采取的步骤:

  1. 在 Azure 门户中注册应用程序并为其创建客户端密码。
  2. 添加我需要的所有权限并授予他们访问权限:

  3. 让管理员在第一次访问时确认这些权限。这是使用以下 URL 完成的:

    https://login.microsoftonline.com/{tenant}/v2.0/adminconsent
    ?client_id={app id}
    &state=1234
    &redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
    &scope=https://graph.microsoft.com/.default
    

    我收到了以下回复:

    admin_consent: True
    tenant: ca566779-1e7b-48e8-b52b-68**********
    state: 12345
    scope**: scope: https://graph.microsoft.com/User.Read https://graph.microsoft.com/.default
    

    (范围可能会解释这里稍后描述的问题:为什么当我配置了 13 个不同的权限时,我只得到 User.Read??)

  4. 获取访问令牌(成功!):

  5. 尝试读取用户(成功):

  6. 尝试阅读我自己的电子邮件(没有成功):

  7. 尝试阅读其他人的电子邮件(邀请用户以访客身份访问应用程序,但仍然没有成功):

我不明白为什么我不能阅读消息但我可以阅读用户。似乎权限被完全忽略了(我确认我不需要任何权限来读取用户)。

更新

这是我的租户姓名:

这些是添加到租户的用户:

重要提示:我的 Azure AD 中没有 office 365 订阅。所有这些电子邮件都属于不同的广告。

上一个问题 与我的相似,但我相信这不是重复问题,因为我的问题略有不同,建议的解决方案使用 OAuth1(我使用的是 OAuth2)。

/me 不适用于客户端凭据令牌。 /me 指的是什么?没有涉及用户,因此它没有任何意义。

第二个问题,这个用户在你的租户有Exchange Online邮箱吗?

Microsoft Graph 只能 访问您已通过身份验证的租户内的数据。这意味着您无法访问其他租户的邮箱,即使该用户是您通过身份验证的租户中的访客。允许这样做会违反 AAD/O365 租户中数据隔离的基本原则。

同样重要的是要注意 AAD/O365 和 Outlook.com 是不同的平台。 Microsoft Graph 的核心价值支柱是跨 AAD 和 MSA 的通用 API 层,但在幕后,它们正在调用不同的后端。

除了数据隔离和这些不同的平台之外,Outlook.com 根本不支持应用程序权限(Client Credentials). You can only access Outlook.com using delegated permissions, and even only a limited set of scopes are supported

Not all permissions are valid for both Microsoft accounts and work or school accounts. You can check the Microsoft Account Supported column for each permission group to determine whether a specific permission is valid for Microsoft accounts, work or school accounts, or both.

关于包括哪些范围,我怀疑这里的问题是您没有此租户中的 O365 许可证。如果它允许您在没有订阅的情况下同意,这可能(理论上)导致应用程序意外收到同意 when/if 稍后添加了订阅。也就是说,如果没有看到您要取回的实际令牌的示例,很难说清楚(请随意 post 你们中的一个人希望我对此进行更多调查)。

最后,juunas 关于 /me 也是正确的。 /me 段是 "the currently authenticated user" 的别名。由于您在使用客户端凭据时并未对用户进行身份验证,因此 /me 实际上是 null

接受的答案是帮助我的答案。但是,我最终测试了我需要测试加入的内容: Office 365 Developer Program (free)

此程序将允许您创建最多包含 25 个电子邮件帐户的 Azure Active Directory。它还允许您创建 16 个虚构的电子邮件帐户,其中包含电子邮件(通过单击一个按钮)。您可以免费使用此基础架构 90 天。