Миграция с MSAL версии 1.x на MSAL версии 2.x

Если вы не знакомы с MSAL, вы должны начать здесь. Если вы переходите с MSAL версии 1.x, вы можете воспользоваться этим руководством, чтобы обновить свой код для использования MSAL версии 2.x

1. Обновление регистрации приложения

Перейдите в центр администрирования Microsoft Entra для вашего арендатора и просмотрите раздел «Регистрации приложений». Вы можете создать новую регистрацию для MSAL 2.x или обновить существующую регистрацию для регистрации, которую вы используете для MSAL 1.x.

2. Добавление msal-browser пакета в проект

Используя npm, используйте следующее:

npm install @azure/msal-browser

3. Обновление кода

В MSAL 1.x вы создали экземпляр приложения, как показано ниже:

import * as msal from "msal";

const msalInstance = new msal.UserAgentApplication(config);

В MSAL 2.x это можно обновить, чтобы использовать новый PublicClientApplication объект.

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

const msalInstance = new msal.PublicClientApplication(config);

В объекте конфигурации может быть несколько небольших различий. Если вы передаете более расширенную конфигурацию UserAgentApplication объекту, дополнительные сведения о новых параметрах конфигурации объектов приложения см. здесь .

Сигнатуры объектов запросов и ответов изменились — acquireTokenSilent теперь имеет отдельную сигнатуру объекта, отличную от интерактивных API. Дополнительные сведения о настройке API запросов см. здесь .

Большинство API из MSAL 1.x были перенесены в MSAL 2.x без изменений. Некоторые функции удалены:

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

В MSAL 2.x обработка ответа от хэша является асинхронной операцией, так как MSAL выполнит обмен маркерами, как только он анализирует код авторизации из ответа. Из-за этого при выполнении вызовов с перенаправлением MSAL предоставляет функцию handleRedirectPromise, которая возвращает промис, завершающийся после того, как MSAL полностью обработает перенаправление. При использовании метода перенаправления страница, используемая в качестве redirectUri, должна реализовывать handleRedirectPromise, чтобы гарантировать обработку ответа и кэширование токенов при возврате после перенаправления.

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

Во время loginPopup, acquireTokenPopupили acquireTokenSilent вызовы, вы можете ждать, пока обещание будет разрешено.

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

Дополнительные сведения об использовании см. в документации по входу и получению маркеров .

Теперь токены обновления возвращаются в ответах с токенами и используются библиотекой для обновления токенов доступа без взаимодействия с пользователем и без использования iframe. Дополнительные сведения о продлении маркеров см. в документации по времени существования маркеров .

Все остальные API должны работать как раньше. Рекомендуется ознакомиться с примером по умолчанию , чтобы просмотреть рабочий пример MSAL 2.0.