Migração de MSAL v1.x para MSAL v2.x

Se és novo na MSAL, deves começar por aqui. Se vier do MSAL v1.x, pode seguir este guia para atualizar o seu código para usar o MSAL v2.x

1. Atualizar o registo da candidatura

Vai ao centro de administração Microsoft Entra do teu inquilino e consulta os Registos de Aplicações. Pode criar um novo registo para o MSAL 2.x ou atualizar o seu registo existente para o registo que está a usar para o MSAL 1.x.

2. Adicionar o msal-browser pacote ao seu projeto

Usando npm, use o seguinte:

npm install @azure/msal-browser

3. Atualize o seu código

No MSAL 1.x, criava uma instância de aplicação como segue:

import * as msal from "msal";

const msalInstance = new msal.UserAgentApplication(config);

No MSAL 2.x, podes atualizar isto para usar o novo PublicClientApplication objeto.

import * as msal from "@azure/msal-browser";

const msalInstance = new msal.PublicClientApplication(config);

Podem existir algumas pequenas diferenças no objeto de configuração que é passado. Se estiver a passar uma configuração mais avançada para o UserAgentApplication objeto, veja aqui para mais informações sobre novas opções de configuração de objetos de aplicação.

As assinaturas de objetos de pedido e resposta mudaram – acquireTokenSilent agora tem uma assinatura de objeto separada das APIs interativas. Por favor, consulte aqui para mais informações sobre a configuração das APIs de pedido.

A maioria das APIs do MSAL 1.x foi mantida para o MSAL 2.x sem alterações. Algumas funções foram removidas:

  • handleRedirectCallback
  • urlContainsHash
  • getCurrentConfiguration
  • getLoginInProgress
  • getAccount
  • getAccountState
  • isCallback

No MSAL 2.x, o tratamento da resposta do hash é uma operação assíncrona, pois a MSAL realiza uma troca de tokens assim que analisa o código de autorização da resposta. Por isso, ao realizar chamadas de redirecionamento, o MSAL fornece a handleRedirectPromise função que devolve uma promessa que se resolve quando o redirecionamento for totalmente tratado pelo MSAL. Ao usar um método de redirecionamento, a página usada como redirectUri deve implementar handleRedirectPromise para garantir que a resposta é tratada e os tokens são armazenados em cache ao regressar do redirecionamento.

const myMSALObj = new msal.PublicClientApplication(msalConfig); 

// Register Callbacks for Redirect flow
myMSALObj.handleRedirectPromise().then((tokenResponse) => {
    let accountObj = null;
    if (tokenResponse !== null) {
        accountObj = tokenResponse.account;
        const id_token = tokenResponse.idToken;
        const access_token = tokenResponse.accessToken;
    } else {
        const currentAccounts = myMSALObj.getAllAccounts();
        if (!currentAccounts || currentAccounts.length === 0) {
            // No user signed in
            return;
        } else if (currentAccounts.length > 1) {
            // More than one user signed in, find desired user with getAccountByUsername(username)
        } else {
            accountObj = currentAccounts[0];
        }
    }
    
    const username = accountObj.username;
   
}).catch((error) => {
    handleError(error);
});

function signIn() {
    myMSALObj.loginRedirect(loginRequest);
}

async function getTokenRedirect(request) {
    return await myMSALObj.acquireTokenSilent(request).catch(error => {
        this.logger.info("silent token acquisition fails. acquiring token using redirect");
        // fallback to interaction when silent call fails
        return myMSALObj.acquireTokenRedirect(request)
    });
}

Durante as chamadas loginPopup, acquireTokenPopup ou acquireTokenSilent, pode aguardar que a promessa seja resolvida.

const myMSALObj = new msal.PublicClientApplication(msalConfig); 

async function signIn(method) {
    try {
        const loginResponse = await myMSALObj.loginPopup(loginRequest);
    } catch (err) {
        handleError(error);
    }

    const currentAccounts = myMSALObj.getAllAccounts();
    if (!currentAccounts || currentAccounts.length === 0) {
        // No user signed in
        return;
    } else if (currentAccounts.length > 1) {
        // More than one user signed in, find desired user with getAccountByUsername(username)
    } else {
        accountObj = currentAccounts[0];
    }
}

async function getTokenPopup(request) {
    return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
        this.logger.info("silent token acquisition fails. acquiring token using popup");
        // fallback to interaction when silent call fails
        return await myMSALObj.acquireTokenPopup(request).catch(error => {
            handleError(error);
        });
    });
}

Consulte a documentação sobre início de sessão e obter token para obter informações mais detalhadas sobre a utilização.

Os tokens de atualização são agora devolvidos como parte das respostas do token e são usados pela biblioteca para renovar tokens de acesso sem interação ou uso de iframes. Consulte a documentação dos tempos de vida dos tokens para mais informações sobre renovação de tokens.

Todas as outras APIs devem funcionar como antes. Recomenda-se dar uma vista de olhos à amostra padrão para ver um exemplo funcional do MSAL 2.0.