如何使用相同的 OAuth2 令牌访问 Azure Graph 和 Microsoft Graph?

How can I access Azure Graph AND Microsoft Graph using same OAuth2 token?

我想访问 Azure AD Graph APIMicrosoft Graph API 使用相同的 OAuth2 令牌(在 iOS 的 Swift 3 应用程序中)- 这可能吗?

我想访问以下 APIs:

我在 Azure 门户中创建了一个 Native 应用程序并为 Microsoft Graph[= 添加了权限68=](具有上述权限范围)。

我可以通过 更改 资源 属性 来访问两个 API 进行身份验证(登录时) - Azure 配置似乎是正确的。但是在使用第一个资源进行身份验证时,尝试使用相同的令牌访问另一个 API 时出现 "Unauthorized" 错误。我试图将 URL 添加到 资源 属性,但随后出现错误 ("AADSTS50001: The application name was not found in the tenant.")。我做错了什么或者我错过了什么...?

如果不可能 - 为什么可以在 Azure 门户中添加多个 API?

访问两者的原因 APIs:Microsoft Graph 没有提供所有属性(但支持增量更改)而 Azure AD Graph 提供了完整的配置文件- 两者均未经管理员同意(使用委托权限)

您不能使用相同的访问令牌从字面上调用两个 API。因为访问令牌有特定的受众,当受众声明与其自己的应用程序 ID URI 不匹配时,其中一个 API 将拒绝该令牌。

看来您真正想要完成的是使用一次登录体验获得两个令牌,您可以做到这一点。

使用授权码授予流程,您可以让用户登录而无需指定资源。用户将获得 AAD 和 MS Graph API 权限的同意,并且您的应用程序将在登录完成后取回身份验证代码。

此时,您的应用程序可以使用相同的授权代码调用令牌端点两次,以获得两个端点的两个访问令牌。从那里,您可以管理这两个令牌并同时保持对两个 API 的访问。

我在我的 Python 个示例 here 中执行此操作,除了我的两个端点是 AAD Graph API 和 Azure 资源管理器。

除了Authorization Code Grant Flow之外还有一个选项。如果您有一个针对一个受众的现有访问令牌,并希望将其用于另一个受众(同时保留令牌中包含的客户端和用户的身份),您可以使用 代表授权 将令牌换成新令牌,只是这次针对您需要的资源。

您可以在 formal docs or in my post Getting Access Token for Microsoft Graph Using OAuth REST API 中阅读它。