Jednostráková aplikace: Získání tokenu pro volání rozhraní API

Vzor pro získání tokenů pro rozhraní API s MSAL.js spočívá v prvním pokusu o požadavek na bezobslužný token pomocí acquireTokenSilent metody. Při zavolání této metody knihovna nejprve zkontroluje mezipaměť v úložišti prohlížeče a zjistí, jestli neexistuje přístupový token, jehož platnost nevypršela, a vrátí ho. Pokud se nenajde žádný přístupový token nebo platnost nalezeného přístupového tokenu vypršela, pokusí se použít obnovovací token k získání nového přístupového tokenu. Pokud vypršela platnost 24hodinové životnosti obnovovacího tokenu, MSAL.js otevře skrytý prvek iframe, který bezobslužně požádá o nový autorizační kód pomocí existující aktivní relace s Id Microsoft Entra (pokud existuje), který se pak vymění za novou sadu tokenů (přístup a obnovovací tokeny). Další informace o relacích jednotného přihlašování a hodnotách životnosti tokenů v Microsoft Entra ID najdete v tématu Životnost tokenů. Další informace o zásadách vyhledávání v mezipaměti MSAL.js najdete v tématu: Získání přístupového tokenu.

Žádosti o bezobslužný token na ID Microsoft Entra můžou selhat z důvodů, jako je změna hesla nebo aktualizace zásad podmíněného přístupu. Častěji jsou selhání způsobená vypršením 24hodinové doby platnosti obnovovacího tokenu a prohlížečem blokujícím soubory cookie třetích stran, což brání použití skrytých elementů iframe k pokračování v ověřování uživatele. V těchto případech byste měli vyvolat jednu z interaktivních metod (která může uživatele vyzvat) k získání tokenů:

Volba mezi automaticky otevíraných oken nebo přesměrováním

Volba mezi automaticky otevírané okno nebo prostředím pro přesměrování závisí na toku aplikace:

  • Pokud nechcete, aby se uživatelé během ověřování přesouvají z hlavní stránky aplikace, doporučujeme automaticky otevíranou metodu. Vzhledem k tomu, že přesměrování ověřování probíhá v automaticky otevíraném okně, zachová se stav hlavní aplikace.

  • Pokud mají uživatelé omezení prohlížeče nebo zásady, ve kterých jsou automaticky otevíraná okna zakázaná, můžete použít metodu přesměrování. Použijte metodu přesměrování v prohlížeči Internet Explorer, protože existují známé problémy s automaticky otevíranými okny v Internet Exploreru.

Můžete nastavit obory rozhraní API, které chcete, aby přístupový token zahrnoval při vytváření žádosti o přístupový token. V přístupovém tokenu nemusí být uděleny všechny požadované obory. To závisí na souhlasu uživatele.

Získání tokenu s automaticky otevíraným oknem

Následující kód kombinuje dříve popsaný vzor s metodami pro automaticky otevírané prostředí:

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

Získání tokenu s přesměrováním

Následující vzor je popsaný výše, ale ukazuje se s metodou přesměrování pro interaktivní získání tokenů. Při načítání stránky je potřeba volat a čekat handleRedirectPromise na načtení stránky.

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

Další kroky

Přejděte k dalšímu článku v tomto scénáři volání webového rozhraní API.