Applicazione a pagina singola: acquisire un token per chiamare un'API

Il modello per l'acquisizione di token per le API con MSAL.js consiste nel tentare prima di tutto una richiesta di token invisibile all'utente usando il metodo acquireTokenSilent. Quando questo metodo viene chiamato, la libreria controlla innanzitutto la cache nell'archiviazione del browser per verificare se esiste un token di accesso non scaduto e lo restituisce. Se non viene trovato alcun token di accesso o il token trovato è scaduto, tenta di usare il token di aggiornamento per ottenere un nuovo token di accesso. Se anche la durata di 24 ore del token di aggiornamento è scaduta, MSAL.js apre un iframe nascosto per richiedere automaticamente un nuovo codice di autorizzazione usando la sessione attiva esistente con Microsoft Entra ID (se presente), che verrà scambiato per un nuovo set di token (token di accesso e token di aggiornamento). Per altre informazioni sui valori di durata dei token e della sessione Single Sign-On (SSO) in Microsoft Entra ID, vedere Durate dei token. Per altre informazioni sui criteri di ricerca della cache MSAL.js, vedere: Acquisizione di un token di accesso.

Le richieste di token invisibili all'utente a Microsoft Entra ID potrebbero non riuscire per motivi come una modifica della password o dei criteri di accesso condizionale aggiornati. Più spesso, gli errori sono dovuti alla scadenza del token di aggiornamento di 24 ore e al browser che blocca i cookie di terze parti, cosa che impedisce l'uso di iframe nascosti per continuare l'autenticazione dell'utente. In questi casi, è necessario richiamare uno dei metodi interattivi (che potrebbero richiedere all'utente di acquisire i token):

Scegliere tra un'esperienza popup o di reindirizzamento

La scelta tra un'esperienza popup o di reindirizzamento dipende dal flusso dell'applicazione:

  • Se non si vuole che gli utenti si spostino dalla pagina principale dell'applicazione durante l'autenticazione, è consigliabile usare il metodo popup. Poiché il reindirizzamento dell'autenticazione si verifica in una finestra popup, lo stato dell'applicazione principale viene mantenuto.

  • Se gli utenti hanno vincoli o criteri del browser in cui le finestre popup sono disabilitate, è possibile usare il metodo di reindirizzamento. Usare il metodo di reindirizzamento con il browser Internet Explorer, perché sono presenti problemi noti relativi alle finestre popup in Internet Explorer.

È possibile impostare gli ambiti API da includere nel token di accesso durante la compilazione della richiesta di token di accesso. Tutti gli ambiti richiesti potrebbero non essere concessi nel token di accesso. Ciò dipende dal consenso dell'utente.

Acquisire un token con una finestra popup

Il codice seguente combina il modello descritto in precedenza con i metodi per un'esperienza popup:

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

Acquisire un token con un reindirizzamento

Il modello seguente è come descritto in precedenza, ma illustrato con un metodo di reindirizzamento per acquisire i token in modo interattivo. È necessario chiamare e attendere handleRedirectPromise al caricamento della pagina.

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

Passaggi successivi

Passare all'articolo successivo in questo scenario: Chiamare un'API Web.