我有一个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
?如果这不可能,那么正确的身份验证流程将是什么?
答案 0 :(得分:2)
您无需为此而切换到v2端点,Microsoft Graph支持v1和v2令牌(实际上,我能想到的支持v2的每个API 也都支持v1,但可能是我忘记的例外)。
步骤非常简单:
在Azure门户中更新AAD注册,并添加将要使用的Microsoft Graph权限。
使用resource=<AAD_API_ID>
代替在您的URI中传递resource=graph.microsoft.com
。这将返回可以与Microsoft Graph一起使用的令牌。
重要:您必须请求离线访问范围(offline_access
)才能正常工作。
令人困惑的是,从技术上您不能使用相同的访问令牌来访问API和Microsoft Graph。 支持的功能是在刷新令牌时切换Resource
。因此,是的,虽然您使用的是两个不同的令牌,但是您正在重用相同的凭据/授权代码。
以下是示例流程:
用户使用您的API作为资源(resource=<AAD_API_ID>
)进行身份验证。这会向您的应用程序返回一个授权码。
应用程序将授权代码发布到/token
端点(也使用您的API作为资源)。这会将access_token
和refresh_token
返回到应用程序。
使用此access_token
来调用您的API。
应用程序使用refresh_token
作为资源将/token
发布到graph.microsoft.com
端点。这将返回键到Microsoft Graph的新access_token
和refresh_token
。
使用此新的access_token
来调用Microsoft Graph。
应用程序再次将refresh_token
发布到/token
端点,但是这次再次使用您的API作为资源。这将返回一个新的access_token
和refresh_token
键入您的API。
调用您的API
您可以根据需要重复此循环。根据需要切换的频率,您还可以将API和Graph的访问令牌都保留在内存中,并重用它们直到过期。请确保始终存储您收到的最后一个刷新令牌,以便您可以根据需要获取任一资源的刷新令牌。