我在SPA中使用adal-angular
库(但不使用Angular)尝试获取可用于调用SharePoint API的访问令牌(https://<my-tenant>.sharepoint.com/_api/
)。
我在Azure AD中注册了一个应用程序,并在清单中启用了隐式流,现在我在本地运行我的SPA,这就是为什么有一个localhost重定向URI。以下代码正在启动时执行:
const context = new AuthenticationContext({
clientId: '<my-client-id>',
redirectUri: 'http://localhost:3000/signin',
popUp: true,
loginResource: 'https://<my-tenant>.sharepoint.com',
callback: () => window.location.reload()
});
const user = context.getCachedUser();
if (!user) {
context.login();
} else {
context.acquireToken('https://<my-tenant>.sharepoint.com', (error, token) => {
console.log(error, token);
});
}
我已登录到SharePoint网站,因此使用此配置时,所有内容都会自动发生,并且我会看到一个JWT访问令牌已记录到控制台。但是,当我检查令牌时,我发现观众是<my-client-id>
。使用访问令牌调用https://<my-tenant>.sharepoint.com/_api/v1.0/me
时,我会收到401响应,并显示以下错误消息:
{"error_description": "Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}
我很确定这一切都归结为我不能正确理解OAuth2流,但是......我如何获得SharePoint实际可以与SharePoint一起使用的令牌?我是否以错误的方式思考这个问题?如果我的应用程序检索到的令牌只能用于对我自己的应用程序进行身份验证,那么它有点失败。
答案 0 :(得分:0)
在此处详细描述了获取SharePoint的访问令牌:
OneDrive for Business authentication and sign in
您应该考虑首先获取Discovery端点的令牌:
使用为资源收到的访问令牌
https://api.office.com/discovery/
您可以向我们提出请求 发现API以了解哪些服务可用
如果调用成功,则响应正文包含JSON数据 有关用户和您的应用程序可用服务的信息。
{
"@odata.context": "https:\/\/api.office.com\/discovery\/v1.0\/me\/$metadata#allServices",
"value": [
{
"@odata.type": "#Microsoft.DiscoveryServices.ServiceInfo",
"capability": "MyFiles",
"serviceApiVersion": "v2.0",
"serviceEndpointUri": "https:\/\/contoso-my.sharepoint.com\/_api\/v2.0",
"serviceResourceId": "https:\/\/contoso-my.sharepoint.com\/"
}
]
}
您应该获得有效的资源ID ...但是这里的问题可能只是您在示例代码的资源URL末尾没有包含forwardslash(/
)。