"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".
这些是我必须采取的步骤:
- 在 Azure 门户中注册应用程序并为其创建客户端密码。
添加我需要的所有权限并授予他们访问权限:
让管理员在第一次访问时确认这些权限。这是使用以下 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
??)
获取访问令牌(成功!):
尝试读取用户(成功):
尝试阅读我自己的电子邮件(没有成功):
尝试阅读其他人的电子邮件(邀请用户以访客身份访问应用程序,但仍然没有成功):
我不明白为什么我不能阅读消息但我可以阅读用户。似乎权限被完全忽略了(我确认我不需要任何权限来读取用户)。
更新
这是我的租户姓名:
这些是添加到租户的用户:
重要提示:我的 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 天。
我想定期从控制台应用程序访问 Microsoft Graph,以便将邮件从 Outlook 邮箱复制到数据库。 为了以编程方式进行身份验证,我不得不使用 Microsoft Graph 的 "Client Credentials Flow".
这些是我必须采取的步骤:
- 在 Azure 门户中注册应用程序并为其创建客户端密码。
添加我需要的所有权限并授予他们访问权限:
让管理员在第一次访问时确认这些权限。这是使用以下 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
??)获取访问令牌(成功!):
尝试读取用户(成功):
尝试阅读我自己的电子邮件(没有成功):
尝试阅读其他人的电子邮件(邀请用户以访客身份访问应用程序,但仍然没有成功):
我不明白为什么我不能阅读消息但我可以阅读用户。似乎权限被完全忽略了(我确认我不需要任何权限来读取用户)。
更新
这是我的租户姓名:
这些是添加到租户的用户:
重要提示:我的 Azure AD 中没有 office 365 订阅。所有这些电子邮件都属于不同的广告。
上一个问题
/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 天。