Поделиться через


Одностраничное приложение: получение маркера для вызова API

Шаблон для получения токенов для API с помощью MSAL.js состоит в том, чтобы сначала попытаться выполнить тихий запрос токена с помощью метода acquireTokenSilent. При вызове этого метода библиотека сначала проверяет кэш в хранилище браузера, чтобы узнать, существует ли маркер доступа без истечения срока действия и возвращает его. Если маркер доступа не найден или срок действия маркера доступа истек, он пытается использовать его маркер обновления для получения нового маркера доступа. Если срок жизни маркера обновления 24-часовой срок действия также истек, MSAL.js открывает скрытый iframe для автоматического запроса нового кода авторизации с использованием существующего активного сеанса с идентификатором Microsoft Entra (если таковые имеются), который затем будет обменен на новый набор маркеров (маркеры доступа и обновления). Дополнительные сведения о сеансе единого входа и значениях времени существования токена в идентификаторе Microsoft Entra см. в разделе "Время существования токенов". Дополнительные сведения о политике поиска кэша MSAL.js см. в статье "Получение маркера доступа".

Запросы автоматического маркера к идентификатору Microsoft Entra могут завершиться ошибкой по таким причинам, как изменение пароля или обновленные политики условного доступа. Чаще всего сбои связаны с тем, что истек 24-часовой срок существования маркера обновления и браузер блокирует сторонние файлы cookie, что предотвращает использование скрытых окон iframe для продолжения проверки подлинности пользователя. В этих случаях следует вызвать один из интерактивных методов получения токенов (из-за которого пользователь может получить запрос):

Выбор между такими методами, как всплывающее окно и перенаправление

Выбор между методами всплывающего окна и перенаправления зависит от блок-схемы приложения:

  • Если вы не хотите, чтобы пользователи переходили со страницы основного приложения во время проверки подлинности, рекомендуем использовать метод всплывающего окна. Так как перенаправление проверки подлинности происходит во всплывающем окне, состояние основного приложения сохраняется.

  • Если у пользователей есть ограничения браузера или политики, где отключены всплывающие окна, можно использовать метод перенаправления. Используйте метод перенаправления в браузере Internet Explorer, так как существуют известные проблемы со всплывающими окнами в Internet Explorer.

Можно задать области API, которые должен включать маркер доступа, когда создает запрос маркера доступа. Маркер доступа может включать не все запрошенные области. Это зависит от согласия пользователя.

Получение маркера с помощью всплывающего окна

Следующий код объединяет ранее описанный шаблон с методами для всплывающего окна:

// MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
const account = publicClientApplication.getAllAccounts()[0];

const accessTokenRequest = {
  scopes: ["user.read"],
  account: account,
};

publicClientApplication
  .acquireTokenSilent(accessTokenRequest)
  .then(function (accessTokenResponse) {
    // Acquire token silent success
    let accessToken = accessTokenResponse.accessToken;
    // Call your API with token
    callApi(accessToken);
  })
  .catch(function (error) {
    //Acquire token silent failure, and send an interactive request
    if (error instanceof InteractionRequiredAuthError) {
      publicClientApplication
        .acquireTokenPopup(accessTokenRequest)
        .then(function (accessTokenResponse) {
          // Acquire token interactive success
          let accessToken = accessTokenResponse.accessToken;
          // Call your API with token
          callApi(accessToken);
        })
        .catch(function (error) {
          // Acquire token interactive failure
          console.log(error);
        });
    }
    console.log(error);
  });

Получение маркера с помощью перенаправления

Следующий шаблон подобен описанному ранее, но показан с помощью метода перенаправления для получения маркеров в интерактивном режиме. Вам нужно вызвать и ожидать handleRedirectPromise нагрузку на страницу.

const redirectResponse = await publicClientApplication.handleRedirectPromise();
if (redirectResponse !== null) {
  // Acquire token silent success
  let accessToken = redirectResponse.accessToken;
  // Call your API with token
  callApi(accessToken);
} else {
  // MSAL.js v2 exposes several account APIs, logic to determine which account to use is the responsibility of the developer
  const account = publicClientApplication.getAllAccounts()[0];

  const accessTokenRequest = {
    scopes: ["user.read"],
    account: account,
  };

  publicClientApplication
    .acquireTokenSilent(accessTokenRequest)
    .then(function (accessTokenResponse) {
      // Acquire token silent success
      // Call API with token
      let accessToken = accessTokenResponse.accessToken;
      // Call your API with token
      callApi(accessToken);
    })
    .catch(function (error) {
      //Acquire token silent failure, and send an interactive request
      console.log(error);
      if (error instanceof InteractionRequiredAuthError) {
        publicClientApplication.acquireTokenRedirect(accessTokenRequest);
      }
    });
}

Следующие шаги

Перейдите к следующей статье в этом сценарии, Вызов веб-API.