Dela via


Ensidesprogram: Hämta en token för att anropa ett API

Mönstret för att hämta token för API:er med MSAL.js är att först försöka med en tyst tokenbegäran med hjälp acquireTokenSilent av metoden. När den här metoden anropas kontrollerar biblioteket först cachen i webbläsarlagringen för att se om det finns en åtkomsttoken som inte har upphört att gälla och returnerar den. Om ingen åtkomsttoken hittas eller om åtkomsttoken har upphört att gälla försöker den använda sin uppdateringstoken för att hämta en ny åtkomsttoken. Om uppdateringstokens livslängd på 24 timmar också har upphört att gälla MSAL.js öppnar en dold iframe för att tyst begära en ny auktoriseringskod med hjälp av den befintliga aktiva sessionen med Microsoft Entra-ID (om någon) som sedan byts ut mot en ny uppsättning token (åtkomst - och uppdateringstoken). Mer information om sessions- och tokenlivsvärden för enkel inloggning (SSO) i Microsoft Entra-ID finns i Tokens livslängd. Mer information om MSAL.js cache-uppslagsprincip finns i: Hämta en åtkomsttoken.

Begäranden om tyst token till Microsoft Entra-ID kan misslyckas av orsaker som lösenordsändring eller uppdaterade principer för villkorsstyrd åtkomst. Oftast beror fel på att uppdateringstokens livslängd på 24 timmar upphör att gälla och webbläsaren blockerar cookies från tredje part, vilket förhindrar att dolda iframes används för att fortsätta autentisera användaren. I dessa fall bör du anropa en av de interaktiva metoderna (som kan uppmana användaren) att hämta token:

Välj mellan en popup- eller omdirigeringsupplevelse

Valet mellan en popup- eller omdirigeringsupplevelse beror på ditt programflöde:

  • Om du inte vill att användarna ska flytta från huvudprogramsidan under autentiseringen rekommenderar vi popup-metoden. Eftersom omdirigeringen av autentisering sker i ett popup-fönster bevaras huvudprogrammets tillstånd.

  • Om användarna har webbläsarbegränsningar eller principer där popup-fönster är inaktiverade kan du använda omdirigeringsmetoden. Använd omdirigeringsmetoden med Webbläsaren Internet Explorer eftersom det finns kända problem med popup-fönster i Internet Explorer.

Du kan ange de API-omfång som du vill att åtkomsttoken ska inkludera när den skapar begäran om åtkomsttoken. Alla begärda omfång kanske inte beviljas i åtkomsttoken. Det beror på användarens medgivande.

Hämta en token med ett popup-fönster

Följande kod kombinerar det tidigare beskrivna mönstret med metoderna för en popup-upplevelse:

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

Hämta en token med en omdirigering

Följande mönster beskrivs tidigare men visas med en omdirigeringsmetod för att hämta token interaktivt. Du måste anropa och vänta handleRedirectPromise på sidinläsning.

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

Nästa steg

Gå vidare till nästa artikel i det här scenariot, Anropa ett webb-API.