Как получить действительный токен доступа для моего API и Microsoft Graph из Azure Active Directory? - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь настроить приложение spa javascript, которое регистрирует пользователя в нашем клиенте azure active directory, а затем извлекает информацию о профиле из графа Microsoft и вызывает функцию azure, написанную в ядре c# (мой API).

У меня настроены отдельные регистрации приложений для моего веб-сайта и API в azure активной директории.

Я использую библиотеку MSAL. js на веб-сайте javascript spa и использую более новые конечные точки microsoft identity / v2.0.

Приложение SPA входит в активный каталог, как и ожидалось, и может использовать токен доступа для вызова графа для получения информации о профиле. В моей функции azure я проверяю токен, и это завершается ошибкой "IDX10511: Проверка подписи не удалась. Ключи пробовали: ....."

Теперь, если я удаляю граф Microsoft из областей при запросе токена я получаю токен, который при передаче в функцию azure отлично проверяется, но я больше не могу получить данные профиля в приложении spa?

Как заставить оба работать?

Стоит также отметить, что я протестировал токены с помощью jwt.io и также не может проверить подпись при использовании графика.

Вот как я получаю свой токен:

var msalConfig = {
  auth: {
    redirectUri: window.location.origin, // forces top level instead of specific login pages - fixes deep link issues.
    clientId: "Client ID of the website app", //This is your client ID
    authority:
      "https://login.microsoftonline.com/my-tennant-guid" //This is your tenant info
  },

  cache: {
    cacheLocation: "localStorage",
    storeAuthStateInCookie: true
  }
};
const msalUserAgent = new Msal.UserAgentApplication(msalConfig);


var requestObj = {
  scopes: ["User.Read", "api://MyApi/Access"]
};

//when the spa starts up I login using redirects
msalUserAgent.loginRedirect(requestObj);


//then before calling an api I request a token using this method
 acquireTokenSilent() {
    var promise = msalUserAgent.acquireTokenSilent(requestObj);
    return promise;
  },


1 Ответ

1 голос
/ 17 января 2020

Попробуйте указать области как scopes: ["User.Read"] в функции acquTokenSilent (). Поскольку токен доступа действителен только для одного API. Если вам нужно два, дважды вызовите acquTokenSilent с разными областями.

Можно указывать области для двух API при входе, но не при получении токенов. У токена есть аудитория, которая указывает целевой API. Таким образом, вы не можете использовать токен для одного API против другого. И поэтому он действителен только для одного API.

...