我有一个能够调用Graph API的机器人框架应用程序。有一个oauth身份验证流程可以将我的用户登录到bot应用程序。我可以像以下请求一样查询Graph API:
https://graph.microsoft.com/v1.0/me
https://graph.microsoft.com/v1.0/sites/xxxx.sharepoint.com:/sites/test:/lists/Test/items
我想使用与调用Graph API相同的令牌查询SharePoint Online API 。我在Azure门户中的AAD应用程序中授予了必要的权限。我写了下面的代码,但我从SPO API中得到了401 Not Authorized
异常。如何使用相同的令牌调用SPO API?
ClientContext context = TokenHelper.GetClientContextWithAccessToken("https://mytenant.sharepoint.com/sites/test/", _token);
SharePoint.Client.List testList = context.Web.Lists.GetByTitle("Test");
CamlQuery query = CamlQuery.CreateAllItemsQuery(100);
ListItemCollection items = testList.GetItems(query);
context.Load(items);
context.ExecuteQuery(); //Fires 401 error
答案 0 :(得分:1)
您不能也不应使用Microsoft Graph的access_token作为受众来调用SPO API。
原因:
在Azure AD access_token中,它必须包含“ aud”声明。
它标识令牌的预期接收者。在访问令牌中,访问者是资源应用程序的应用程序ID或标识符,在Azure门户中分配给您的应用程序。 资源应用程序应验证此值,如果该值不匹配,则拒绝令牌。
因此,在第一个access_token中,其访问者应该是Microsoft Graph API,而不是SPO API。 当您尝试使用access_token调用Microsoft Graph API时,应验证“ aud”声明。 但是,如果尝试使用该access_token调用SPO API,则不会验证“ aud”声明值,并且SPO API将其视为无效的acc_token并给出“ 401未经授权”响应。
在Azure AD中查看有关access_token的更多详细信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-tokens
更多信息:
如果要使用SPO API,我们需要先使用Office 365 Discovery service来找到正确的服务API端点。但是,Microsoft不再支持此功能,因为由于弃用,新创建的应用程序无法访问O365发现端点。
当前,我们建议您改用Microsoft Graph API。