Aplikacja jednostronicowa: uzyskiwanie tokenu w celu wywołania interfejsu API

Wzorzec uzyskiwania tokenów dla interfejsów API z MSAL.js polega na pierwszej próbie żądania tokenu dyskretnego acquireTokenSilent przy użyciu metody . Po wywołaniu tej metody biblioteka najpierw sprawdza pamięć podręczną w magazynie przeglądarki, aby sprawdzić, czy istnieje token dostępu, który nie wygasł i zwraca go. Jeśli nie znaleziono tokenu dostępu lub znaleziony token dostępu wygasł, próbuje użyć tokenu odświeżania w celu uzyskania nowego tokenu dostępu. Jeśli okres istnienia tokenu odświeżania 24-godzinny również wygasł, MSAL.js otwiera ukryty element iframe w trybie dyskretnym, aby zażądać nowego kodu autoryzacji przy użyciu istniejącej aktywnej sesji z identyfikatorem Entra firmy Microsoft (jeśli istnieje), co spowoduje wymianę nowego zestawu tokenów (tokenów dostępu i odświeżania). Aby uzyskać więcej informacji na temat sesji logowania jednokrotnego i wartości okresu istnienia tokenu w identyfikatorze Entra firmy Microsoft, zobacz Okresy istnienia tokenu. Aby uzyskać więcej informacji na temat zasad wyszukiwania MSAL.js pamięci podręcznej, zobacz: Uzyskiwanie tokenu dostępu.

Żądania tokenu dyskretnego do identyfikatora Entra firmy Microsoft mogą zakończyć się niepowodzeniem z powodów takich jak zmiana hasła lub zaktualizowane zasady dostępu warunkowego. Częściej błędy są spowodowane wygaśnięciem 24-godzinnego okresu istnienia tokenu odświeżania i blokowaniem plików cookie innych firm przez przeglądarkę, co uniemożliwia korzystanie z ukrytych elementów iframe w celu kontynuowania uwierzytelniania użytkownika. W takich przypadkach należy wywołać jedną z metod interaktywnych (które mogą monitować użytkownika) o uzyskanie tokenów:

  • Okno podręczne, przy użyciu polecenia acquireTokenPopup
  • Przekierowywanie przy użyciu polecenia acquireTokenRedirect

Wybieranie między wyskakującym lub przekierowywanym środowiskiem

Wybór między wyskakującym lub przekierowywanym środowiskiem zależy od przepływu aplikacji:

  • Jeśli nie chcesz, aby użytkownicy odeszli od strony głównej aplikacji podczas uwierzytelniania, zalecamy użycie metody wyskakujących okienek. Ponieważ przekierowanie uwierzytelniania odbywa się w oknie podręcznym, stan głównej aplikacji jest zachowywany.

  • Jeśli użytkownicy mają ograniczenia przeglądarki lub zasady, w których okna podręczne są wyłączone, możesz użyć metody przekierowania. Użyj metody przekierowania w przeglądarce Internet Explorer, ponieważ istnieją znane problemy z oknami podręcznymi w programie Internet Explorer.

Zakresy interfejsu API, które mają zostać uwzględnione w tokenie dostępu podczas tworzenia żądania tokenu dostępu. Wszystkie żądane zakresy mogą nie zostać przyznane w tokenie dostępu. Zależy to od zgody użytkownika.

Uzyskiwanie tokenu przy użyciu okna podręcznego

Poniższy kod łączy wcześniej opisany wzorzec z metodami obsługi wyskakujących okienek:

// 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);
  });

Uzyskiwanie tokenu za pomocą przekierowania

Poniższy wzorzec jest opisany wcześniej, ale pokazany przy użyciu metody przekierowania w celu interaktywnego uzyskiwania tokenów. Musisz wywołać metodę i poczekać handleRedirectPromise na załadowanie strony.

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);
      }
    });
}

Następne kroki

Przejdź do następnego artykułu w tym scenariuszu Wywoływanie internetowego interfejsu API.