#angular #microsoft-graph-api #unauthorized
#angular #microsoft-graph-api #несанкционированный
Вопрос:
Мое приложение находится в angular 8 с использованием MSAL версии 2.0. Приложение запрашивает учетные данные office 365 пользователя, регистрирует их, а затем позволяет им создать событие в своем календаре. Пользователь успешно зарегистрирован, токен получен, но при попытке создать событие в календаре с помощью MS Graph Rest API система выдает несанкционированную ошибку 401.
Приведенная ниже функция входа в систему возвращает сообщение об успешном входе в систему при входе пользователя в систему. Значение accessToken равно null, но idToken имеет значение. Должен ли accessToken иметь значение? Кроме того, ошибка 401 вызвана тем, что в команде loginPopup требуется область видимости?:
loginPopup(request) {
return super.loginPopup(request)
.then((authResponse) =>
this.broadcastService.broadcast("msal:loginSuccess", authResponse);
return authResponse;
})
.catch((error) => {
this.broadcastService.broadcast("msal:loginFailure", error);
this.getLogger().error("Error during login:n" error.errorMessage);
throw error;
});
}
Сообщение об ошибке:
зона-evergreen.js: 1042 «POST https://graph.microsoft.com/v1.0/me/events 401 (Несанкционированный)»
Щелчок по ссылке https://graph.microsoft.com/v1.0/me/events в этом сообщении об ошибке показано: https://login.microsoftonline.com//oauth2/v2.0/authorize?response_type=id_tokenamp;scope=openid profileamp;client_id=amp;redirect_uri=https://myApp.abc.com/amp;state==amp;nonce=ad9d4ce5-7676-5515-a36c-7b2b3c70d366amp;client_info=1amp;x-client-SKU=MSAL.JSamp;x-client-Ver=1.4.2amp;login_hint=sales1@abc.comamp;client-request-id=amp;response_mode=fragmentamp;sso_reload=true
Комментарии:
1. Не могли бы вы поделиться идентификатором запроса, меткой времени и полным ответом на ошибку для неудачного запроса?
2. Для вызова Microsoft Graph вам нужен токен доступа. Пожалуйста, ознакомьтесь с методом, использующим msal.js : learn.microsoft.com/en-us/azure/active-directory/develop /. …
3. Если мой ответ полезен для вас, вы можете принять его как ответ (нажмите на галочку рядом с ответом, чтобы переключить его с серого на заполненный.). Это может быть полезно для других участников сообщества. Спасибо 🙂
Ответ №1:
Это потому, что вы просто отправляете запрос на вход в систему, а не запрашиваете получение токена доступа. Ваш response_type=id_token
, так что вы получили только токен id.
Для вызова этого API требуется наличие токена доступа, поскольку вы вызываете /me
конечную точку, поэтому вам необходимо получить токен пользователя в интерактивном режиме:
const requestObj = {
scopes: ["user.read"]
};
this.authService.acquireTokenPopup(requestObj).then(function (tokenResponse) {
// Callback code here
console.log(tokenResponse.accessToken);
}).catch(function (error) {
console.log(error);
});