Вызов веб-API из React SPA с использованием недостающей области response-aad-msal
Я вызываю защищенный веб-API из веб-приложения SPA. И спа-центр, и веб-API были зарегистрированы в AzureAD, и каждый из них зарегистрирован друг для друга через "Expose API" и "API-разрешения".
После аутентификации клиента перед вызовом веб-API выполняется вызов (await this.props.provider.getAccessToken()) для получения токена доступа. Провайдер аутентификации настроен как:
export const authProvider = new MsalAuthProvider(
{
auth: {
authority: "https://login.microsoftonline.com/common",
clientId: "xxxx-xxxx-xxxxx",
postLogoutRedirectUri: window.location.origin,
redirectUri: window.location.origin,
validateAuthority: true,
navigateToLoginRequestUrl: false
},
system: {
logger: logger as any
},
cache: {
cacheLocation: "sessionStorage",
storeAuthStateInCookie: false
}
},
{
scopes: ["openid", "user.read", "api://xxxx-xxxxx-xxxxx/user_impersonation"]
},
{
loginType: LoginType.Redirect,
tokenRefreshUri: window.location.origin + "/auth.html"
}
);
Где "api://xxxx-xxxxx-xxxxx/user_impersonation" - это запрос области веб-API. Авторизация для веб-API не выполняется с ошибкой 401, потому что при проверке возвращенный токен доступа не имеет области веб-API в утверждениях.
1 ответ
Токен доступа AAD действителен только для одного API, поэтому убедитесь, что когда вы запрашиваете токен, вы указываете только область для своего API. Затем AAD предоставит вашему приложению токен для вашего API. Можно указать области для более чем одного API в запросе аутентификации, но когда вы запрашиваете токены, указывайте только области для одного API.
В массиве scopes у вас есть user.read, который предназначен для MS Graph API.