Migrando da MSAL v1.x para a MSAL v2.x

Se você for novo no MSAL, comece aqui. Se você estiver vindo da MSAL v1.x, poderá seguir este guia para atualizar seu código para usar MSAL v2.x

1. Atualizar o registro do aplicativo

Acesse o centro de administração do Microsoft Entra para seu locatário e revise os registros de aplicativo. Você pode criar um novo registro para MSAL 2.x ou atualizar seu registro existente para o registro que está usando para MSAL 1.x.

2. Adicionar o msal-browser pacote ao seu projeto

Usando o npm, use o seguinte:

npm install @azure/msal-browser

3. Atualize seu código

No MSAL 1.x, você criou uma instância de aplicativo como abaixo:

import * as msal from "msal";

const msalInstance = new msal.UserAgentApplication(config);

No MSAL 2.x, você pode atualizá-lo para usar o novo PublicClientApplication objeto.

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

const msalInstance = new msal.PublicClientApplication(config);

Pode haver algumas pequenas diferenças no objeto de configuração que é passado. Se você estiver passando uma configuração mais avançada para o UserAgentApplication objeto, consulte aqui para obter mais informações sobre as novas opções de configuração de objeto de aplicativo.

As assinaturas de objeto de solicitação e resposta foram alteradas– acquireTokenSilent agora tem uma assinatura de objeto separada das APIs interativas. Confira aqui mais informações sobre como configurar as APIs de solicitação.

A maioria das APIs da MSAL 1.x foi encaminhada para a MSAL 2.x sem alteração. Algumas funções foram removidas:

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

No MSAL 2.x, lidar com a resposta do hash é uma operação assíncrona, pois a MSAL executará uma troca de tokens assim que analisar o código de autorização da resposta. Por isso, ao executar chamadas de redirecionamento, a MSAL fornece a handleRedirectPromise função que retornará uma promessa que será resolvida quando o redirecionamento for totalmente tratado pela MSAL. Ao usar um método de redirecionamento, a página usada como redirectUri deve implementar handleRedirectPromise para garantir que a resposta seja tratada e que os tokens sejam armazenados em cache ao retornar 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, você pode aguardar a resolução da promessa.

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 os documentos de logon e aquisição de token para obter informações mais detalhadas sobre o uso.

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

Todas as outras APIs devem funcionar como antes. É recomendável dar uma olhada no exemplo padrão para ver um exemplo de trabalho do MSAL 2.0.