Ошибка проверки токена API Microsoft Graph - PullRequest
0 голосов
/ 10 октября 2018

Я бы использовал Microsoft Graph API в своем Angular Web-приложении.

Сначала я подключаюсь, используя msal library Когда я пытаюсь войти в систему с моим профилем, я получаю эту ошибку

Я настроил свое приложение как упомянутое в официальном образце git

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true
}),

Аутентификация работает, и я получаю токен.

Затем, когда яна домашней странице я делаю второй запрос к Microsoft Graph API для получения информации о пользователе, используя этот токен.

getProfile() {
  let header= new Headers();
  let tokenid= sessionStorage.getItem('msal.idtoken'); 
  header.set('Authorization', 'Bearer ' + tokenid)
  let url ="https://graph.microsoft.com/v1.0/me/"
  return this.http.get(url,{headers:header});
}

}

Я получаю 401 несанкционированную ошибку с ответом:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure.",
    "innerError": {
      "request-id": "xxxxxx",
      "date": "2018-10-09T22:58:41"
    }
  }
}

Я не знаю, почему MG API не принимает мой токен. Я использую неверный URL-адрес полномочий?

ОБНОВЛЕНИЕ : Я понял, что на самом деле я получаю id_token, которыйотличается от токена доступа.Как получить токен доступа из библиотеки MSAL для выполнения вызовов API MS GRAPH?:

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Согласно к тому же образцу вы также можете присоединить HttpInterceptor, который автоматически присоединит токен доступа к каждому (внешнему) HTTP-вызову.

Byчитая документацию, я нашел следующую информацию:

acceptScopes: Позволяет клиенту указывать желаемые области, которые должны быть согласованы.Области могут быть из нескольких ресурсов / конечных точек.Передавая здесь область действия, вы только согласитесь, и токен доступа не будет получен до тех пор, пока клиент фактически не вызовет API.Это необязательно, если вы используете MSAL только для входа (Аутентификация).

Это говорит о том, что использование HttpInterceptor не только присоединяет маркер доступа, но и извлекаетЭто.Токен, который вы видите, вероятно, является просто токеном для вашего приложения, но не является допустимым токеном для Graph API.

Внутренне он использует getCachedTokenInternal(scopes: Array<string>, user: User), чтобы получить новый токен доступа для определенных областей код найден здесь .Я не уверен, что вы также можете использовать этот метод, чтобы получить новый токен для этого ресурса.Я бы просто использовал перехватчик.

Вы можете попробовать скопировать токен доступа и посмотреть, как он выглядит на jwt.ms (программа просмотра токенов JWT от Microsoft) или jwt.io .

Любые токены, действительные для Graph, должны иметь Audience из https://graph.microsoft.com, поэтому, если вы проверяете токен (в jwt.ms), он должен по крайней мере иметь этозначение.

"aud": "https://graph.microsoft.com",
0 голосов
/ 10 октября 2018

Проблема в том, что вы используете id_token вместо токена доступа:

let tokenid= sessionStorage.getItem('msal.idtoken');

становится примерно таким:

let tokenid= sessionStorage.getItem('msal.token'); // or msal.accesstoken

Обновление (согласно комментарию Филиппа)

Вам необходимо выбрать области, на которые вы хотите ориентироваться в вашем приложении.Похоже, вам нужен профиль пользователя, поэтому вы захотите добавить свойство grantScopes, чтобы указать, какие области будет использовать ваше приложение:

MsalModule.forRoot({
  clientID: "Tenant ID",
  authority: "https://login.microsoftonline.com/common/",
  redirectUri: "http://localhost:4200/",
  validateAuthority : true,
  popUp: true,
  consentScopes: ["user.read"]
}),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...