У меня есть приложение React, зарегистрированное в Azure Active Directory. В разделе Разрешения API я добавил разрешения для доступа к API, к которому я пытаюсь получить доступ.
Я использую пакет Reaction-Adal для обработки входа и хранения токенов доступа, когда пользователь входит в приложение. Насколько я понимаю, на этом этапе создается токен доступа для API, и adalFetch обрабатывает логистику во время вызова API.
Ответ от API - это объект ошибки (я заменил действительные идентификаторы; да, они точно совпадают и верны в AAD):
{
message: "AADSTS500011: The resource principal named https://EMCloudAD.onmicrosoft.com/APP_ID/access_as_user was not found in the tenant named TENANT. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant."
msg: "invalid_resource"
}
Я искал все выше и ниже, чтобы найти решение, почему это не работает. Есть документация по API, но ни одна из них не определяет ресурс или что-либо кроме различных конечных точек, т.е. http://thing -api.azurewebsites.net / api / endpointGoesHere
Страница API гласит:
Чтобы использовать API, приложения должны реализовать современную аутентификацию (OIDC) с использованием AzureAD (AAD), а затем запросить токен у AAD для API.
Идентификатор приложения в Azure - https://EMCloudAD.onmicrosoft.com/APP_ID, для него требуется область «access_as_user».
adalConfig.js
import { AuthenticationContext, adalFetch, withAdalLogin } from 'react-adal';
export const adalConfig = {
clientId: CLIENT_ID,
tenant: TENANT,
endpoints: {
thingApi: 'https://EMCloudAD.onmicrosoft.com/APP_ID/access_as_user',
graphApi: 'https://graph.microsoft.com',
},
cacheLocation: 'localStorage',
};
export const authContext = new AuthenticationContext(adalConfig);
export const adalApiFetch = (fetch, url, options) =>
adalFetch(authContext, adalConfig.endpoints.thingApi, fetch, url, options);
export const adalGraphFetch = (fetch, url, options) =>
adalFetch(authContext, adalConfig.endpoints.graphApi, fetch, url, options);
Функция для вызова API. Выполняется в componentDidMount.
TrainLanding.jsx
//Returns error
fetchData = () => {
adalApiFetch(fetch, 'http://thing-api.azurewebsites.net/api/EventGet', {})
.then((response) => {
response.json()
.then((responseJson) => {
this.setState({ apiResponse: JSON.stringify(responseJson, null, 2) }, () => {
console.log(this.state.apiResponse)
})
});
})
.catch((error) => {
console.error(error);
})
}
//works perfectly fine
fetchGraph = () => {
adalGraphFetch(fetch, 'https://graph.microsoft.com/v1.0/me', {})
.then((response) => {
response.json()
.then((responseJson) => {
this.setState({ apiResponse: JSON.stringify(responseJson, null, 2) }, () => {
console.log(this.state.apiResponse)
})
});
})
.catch((error) => {
console.error(error);
})
}
Я точно так же настроил вызов API API для тестирования метода, и он отлично работает. Так что я знаю, что adal настроен правильно, я просто не понимаю, в чем ошибка и где я ошибаюсь. Мой поиск в Google не дал никаких полезных результатов.