Účty v uzlu MSAL

V tomto článku se dozvíte, jak pomocí msal-node knihovny přistupovat k účtům uloženým v mezipaměti v aplikaci Node.js. Rozhraní API, getAllAccounts(), getAccountByHomeId() a getAccountByLocalId() jsou zahrnuta

Předpoklady

Využití

Knihovna msal-node poskytuje následující různá rozhraní API pro přístup k účtům uloženým v mezipaměti:

  • getAllAccounts(): Vrátí všechny účty, které jsou aktuálně v mezipaměti. Aplikace musí zvolit účet pro získání tokenů bezobslužně.
  • getAccountByHomeId(): přijme řetězec homeAccountId a vrátí odpovídající účet z mezipaměti.
  • getAccountByLocalId(): přijímá řetězec localAccountId a vrací odpovídající účet z mezipaměti.

Tady jsou příklady použití pro každé rozhraní API:

getAllAccounts

Scénář s více účty:

// Initiates Acquire Token Silent flow
function callAcquireTokenSilent() {
    // Find all accounts
    const msalTokenCache = myMSALObj.getTokenCache();
    const cachedAccounts = await msalTokenCache.getAllAccounts();

    // Account selection logic would go here

    const account = .... // Select Account code

    // Build silent request after account is selected
    const silentRequest = {
        account: account,
        scopes: scopes,
    };

    // Acquire Token Silently to be used in MS Graph call
    myMSALObj.acquireTokenSilent(silentRequest)
        .then((response) => {
            // Successful response handling
        })
        .catch((error) => {
            // Error handling
        });
}

getAccountByHomeId a getAccountByLocalId

V případě scénáře s jedním účtem je nutné získat homeAccountId nebo localAccountId z počátečního objektu AuthResponse, který byl přijat z interaktivního autorizačního toku, například z toku Auth Code.


// Initialize global homeAccountId variable, ideally stored in application state
let homeAccountId = null; // Same for localAccountId

// Get MSAL Token Cache from MSAL Client Applicaiton object
const msalTokenCache = myMSALObj.getTokenCache();

// Initial token acquisition, second leg of Auth Code flow
function getTokenAuthCode() {
    const tokenRequest = {
        code: req.query.code,
        redirectUri: "http://localhost:3000/redirect",
        scopes: scopes,
    };

    myMSALObj.acquireTokenByCode(tokenRequest).then((response) => {
        // Home account ID or local account ID to be used to find the right account before acquireTokenSilent
        homeAccountId = response.account.homeAccountId; // Same for localAccountId
        .
        .
        .
        // Handle successful token response
    }).catch((error) => {
        // Handle token request error
    });
}

Jakmile jsou účet a tokeny uloženy v mezipaměti a stav aplikace obsahuje řetězec homeAccountId nebo localAccountId, lze před voláním acquireTokenSilent použít getAccountByHomeId a getAccountByLocalId:

async function getResource() {
    // Find account using homeAccountId or localAccountId built after receiving auth code token response
    const account = await msalTokenCache.getAccountByHomeId(app.locals.homeAccountId); // alternativley: await msalTokenCache.getAccountByLocalId(localAccountId) if using localAccountId

    // Build silent request
    const silentRequest = {
        account: account,
        scopes: scopes,
    };
    // Acquire Token Silently to be used in Resource API call
    pca.acquireTokenSilent(silentRequest)
        .then((response) => {
            // Handle successful resource API response
        })
        .catch((error) => {
            // Handle resource API request error
        });
}

Pro scénář s více účty byste měli upravit ukázku (v trase /graphCall) tak, aby vypsala všechny účty uložené v mezipaměti a vybrala konkrétní účet. Možná budete muset přizpůsobit také související šablony zobrazení a handlebars parametry šablon.

Viz také

  • Aktuální ukázka msal-node pro bezobslužný tok sample má funkční scénář s jedním účtem, který používá getAccountByHomeId().