Я использую adal-angular
library (но не с Angular) в своем SPA, чтобы попытаться получить токен доступа, который я могу использовать для вызова API-интерфейсов SharePoint (https://<my-tenant>.sharepoint.com/_api/
).
Я зарегистрировал приложение в Azure AD и включил неявный поток в манифесте, и теперь я запускаю свой SPA локально, поэтому есть локальный 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? Думаю ли я об этом неправильно? Это своего рода поражение цели, если токен, полученный моим приложением, может использоваться только для аутентификации против моего собственного приложения.
Получение токена доступа к SharePoint хорошо описано здесь:
Проверка подлинности OneDrive для бизнеса и вход в систему
Вы должны сначала рассмотреть маркер для конечной точки обнаружения:
Используя токен доступа, полученный для ресурса
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\/"
}
]
}
Там вы должны получить свой действительный идентификатор ресурса... но проблема здесь может заключаться в том, что вы не включили форвард-ловушку (/
) в конце URL-адреса ресурса в своем примере кода.