Microsoft Graph 和自定义 API 的访问令牌

Car*_*han 2 azure-active-directory microsoft-graph-api

我有一个 ReactJs 前端向 API 发出请求。两者都托管在 Azure 中,并在 AAD 中注册应用程序。

我曾经能够使用 v1.0 身份验证端点,并为 API 创建有效令牌:

https://login.microsoftonline.com/common/oauth2/authorize?client_id=<AAD_WEB_APP_ID>&resource=<AAD_API_ID>&response_type=token ...
Run Code Online (Sandbox Code Playgroud)

如果我正确理解文档,则 v2.0 中不允许/不可能使用这种类型的身份验证流程:

但是,该 Web API 只能从具有相同应用程序 ID 的应用程序接收令牌。您无法从具有不同应用程序 ID 的客户端访问 Web API。客户端将无法请求或获取对您的 Web API 的权限。

从 v1.0 更改为 v2.0 的原因是我需要访问 Microsoft Graph(特别是组)。

我的问题是:如何创建access_token适用于 Microsoft Graph 和我的 API 的应用程序?如果这是不可能的,正确的身份验证流程是什么?

Mar*_*eur 5

您不需要为此切换到 v2 端点,Microsoft Graph 同时支持 v1 和 v2 令牌(实际上,我能想到的支持 v2 的每个 API支持 v1,但可能有一个我忘记的例外)。

步骤非常简单:

  1. 在 Azure 门户中更新 AAD 注册,并添加要使用的 Microsoft Graph 的权限。

  2. 不要传递resource=<AAD_API_ID>您的 URI,而是使用resource=graph.microsoft.com. 这将返回可与 Microsoft Graph 一起使用的令牌。

重要提示:必须请求脱机访问范围 ( offline_access) 才能使其正常工作。

令人困惑的是,从技术上讲,您不能使用相同的访问令牌来访问 API 和 Microsoft Graph。支持的Resource刷新令牌时切换。因此,是的,虽然您使用了两个不同的令牌,但您正在重复使用相同的凭据/授权代码。

这是一个示例流程:

  1. 用户使用您的 API 作为资源 ( resource=<AAD_API_ID>) 进行身份验证。这会将授权代码返回给您的应用程序。

  2. 应用程序将授权代码发布到端点/token(也使用您的 API 作为资源)。这会将 anaccess_token和 a返回refresh_token到应用程序。

  3. 使用它access_token来调用您的 API。

  4. 应用程序将其作为资源发布refresh_token/token端点。graph.microsoft.com这将返回一个新的access_tokenrefresh_token键入 Microsoft Graph。

  5. 使用此新功能access_token可以调用 Microsoft Graph。

  6. 应用程序再次将其发布refresh_token/token端点,但这次再次使用您的 API 作为资源。这将返回一个新的access_tokenrefresh_token锁定到您的 API。

  7. 调用您的 API

您可以根据需要重复此循环。根据您需要切换的频率,您还可以将 API 和 Graph 的访问令牌保留在内存中并重复使用它们,直到它们过期。请确保并始终存储您收到的最后一个刷新令牌,以便您可以根据需要获取任一资源的刷新令牌。