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

时间:2018-10-18 12:29:55

标签: azure-active-directory microsoft-graph

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

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

https://login.microsoftonline.com/common/oauth2/authorize?client_id=<AAD_WEB_APP_ID>&resource=<AAD_API_ID>&response_type=token ...

如果我正确理解the documentation,则在v2.0中不允许/可能使用这种身份验证流:

  

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

从v1.0更改为v2.0的原因是我需要访问Microsoft Graph(尤其是 Groups )。

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

1 个答案:

答案 0 :(得分:2)

您无需为此而切换到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作为资源)。这会将access_tokenrefresh_token返回到应用程序。

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

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

  5. 使用此新的access_token来调用Microsoft Graph。

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

  7. 调用您的API

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