Aplicativo de página única: adquirir um token para chamar uma API

O padrão para aquisição de tokens para APIs com a MSAL.js é primeiro tentar fazer uma solicitação de token silenciosa usando o método acquireTokenSilent. Quando esse método é chamado, a biblioteca primeiro verifica o cache no armazenamento do navegador para verificar se há um token de acesso não expirado e o retorna. Se nenhum token de acesso for encontrado, ou o token de acesso encontrado expirou, ele tentará usar o token de atualização para obter um novo token de acesso. Se o tempo de vida de 24 horas do token de atualização também expirou, o MSAL.js abrirá um iframe oculto para solicitar silenciosamente um novo código de autorização usando a sessão ativa existente com o Microsoft Entra ID (se houver), que será trocado por um novo conjunto de tokens (tokens de atualização e acesso). Para obter mais informações sobre a sessão de SSO (logon único) e os valores de tempo de vida do token no Microsoft Entra ID, confira Tempos de vida do token. Para obter mais informações sobre a política de pesquisa de cache do MSAL.js, consulte Adquirir um token de acesso.

As solicitações de token silencioso para o Microsoft Entra ID podem falhar por motivos como uma alteração de senha ou políticas de Acesso Condicional atualizadas. Mais frequentemente, as falhas são devido ao tempo de vida de 24 horas do token de atualização expirar e o navegador bloqueando cookies de terceiros, o que impede o uso de iframes ocultos para continuar a autenticar o usuário. Nesses casos, você deve invocar um dos métodos interativos (que podem solicitar ao usuário) para adquirir tokens:

Escolher entre uma experiência de pop-up ou de redirecionamento

A escolha entre uma experiência de pop-up ou de redirecionamento depende do fluxo do seu aplicativo:

  • Caso você não deseje que os usuários saiam da página principal do aplicativo durante a autenticação, recomendamos o método de pop-up. Como o redirecionamento da autenticação ocorre em uma janela pop-up, o estado do aplicativo principal é preservado.

  • Se os usuários tiverem restrições de navegador ou políticas nas quais as janelas pop-up estejam desabilitadas, você poderá usar o método de redirecionamento. Use o método de redirecionamento com o navegador Internet Explorer, pois há problemas conhecidos com as janelas pop-up no Internet Explorer.

Você poderá definir os escopos de API que deseja incluir no token de acesso quando ele criar a solicitação de token de acesso. Todos os escopos solicitados podem não ser concedidos no token de acesso. Isso depende do consentimento do usuário.

Adquirir um token com uma janela pop-up

O seguinte código combina o padrão descrito anteriormente com os métodos para uma experiência de pop-up:

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

Adquirir um token com um redirecionamento

O padrão a seguir é o mesmo descrito anteriormente, mas mostrado com um método de redirecionamento para adquirir tokens de maneira interativa. Você precisa chamar e aguardar a handleRedirectPromise após o carregamento da página.

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

Próximas etapas

Vá para o próximo artigo nesse cenário, Recorrendo a uma API Web.