Prestaties in MSAL Node

Prerequisites

  • Raadpleeg Prestaties in MSAL Browser waarin de technieken worden beschreven die uw toepassing kan gebruiken om de prestaties van het verkrijgen van tokens te verbeteren met behulp van MSAL.
  • Node.js

Prestaties meten

Toepassingen die de prestaties van verificatiestromen in MSAL Node willen meten, kunnen dit handmatig doen met behulp van de prestatiemeting-API's van Node of vergelijkbaar. Hieronder ziet u een lijst met enkele belangrijke gegevenspunten die u kunt verzamelen:

Data Meaning Suggesties
authType acquireToken* API die wordt gebruikt voor de tokenaanvraag Gebruik dit voor het identificeren van gebruik.
correlationId Correlatie-id die wordt gebruikt voor de tokenaanvraag. U kunt dit verkrijgen via de correlationId eigenschap in AuthenticationResult Gebruik dit voor het identificeren van gebruik.
durationTotalInMs Totale tijd die is besteed aan MSAL, inclusief netwerkgesprekken en cachetoegang Waarschuwing bij algemeen hoge latentie (> 1 seconde). De waarde is afhankelijk van de tokenbron. Vanuit cache: één cachetoegang. Vanuit het netwerk: twee cachetoegangen plus twee HTTP-aanroepen.
durationInCacheInMs Tijd die is besteed aan het laden of opslaan van de persistentie van de tokencache (bijvoorbeeld Redis). Alarm bij pieken.
durationInHttpInMs Tijd besteed aan het maken van HTTP-aanroepen naar IdP (bijvoorbeeld Microsoft Entra ID). U kunt een aangepaste netwerkclient gebruiken voor meer verfijnde bewaking. Zie Configuratie - en aangepaste netwerkvoorbeelden voor meer Alarm bij pieken.
tokenSource Bron van het token (bijvoorbeeld cache versus netwerk). U kunt dit verkrijgen via de fromCache eigenschap in AuthenticationResult Tokens worden veel sneller opgehaald uit de cache (bijvoorbeeld ~100 ms versus ~700 ms). Kan worden gebruikt voor het bewaken en alarmeren van cache hit ratio. Gebruik samen met durationTotalInMs.

Voorbeeld:

    const { PerformanceObserver, performance } = require('node:perf_hooks');

    const perfObserver = new PerformanceObserver((items) => {
        items.getEntries().forEach((entry) => {
            console.log(entry);
        })
    });

    perfObserver.observe({ entryTypes: ["measure"], buffered: true });

    // ...

    performance.mark("acquireTokenByClientCredential-start");

    const tokenResponse = await msalInstance.acquireTokenByClientCredential({
        scopes: ["User.Read.All"],
    });

    performance.mark("acquireTokenByClientCredential-end");

    performance.measure("acquireTokenByClientCredential", {
        start: "acquireTokenByClientCredential-start"
        end: "acquireTokenByClientCredential-end"
        detail: {
            tokenSource: tokenResponse.fromCache
            correlationId: tokenResponse.correlationId
        }
    });

Prestatieoverwegingen voor vertrouwelijke clienttoepassingen

Omdat vertrouwelijke clienttoepassingen voornamelijk worden gebruikt met scenario's aan de serverzijde met betrekking tot gelijktijdige verwerking van aanvragen, raden we u aan MSAL-exemplaren ConfidenticalClientApplication (CCA) te beperken tot elke gebruiker, aanvraag of sessie.

Een nieuw CCA-exemplaar voor elke aanvraag betekent dat de standaardcache in het geheugen in eerste instantie geen tokens of metagegevens bevat over het verkrijgen van tokens. Als zodanig moet het CCA-exemplaar dat u maakt, worden voorbereid voordat de tokenaanvraag wordt uitgevoerd om slechte prestaties te voorkomen.

import {
    ConfidentialClientApplication,
    AuthenticationResult,
    CryptoProvider,
    OnBehalfOfRequest
} from "@azure/msal-node";

function getMsalInstance(partitionKey: string): ConfidentialClientApplication {
    return new ConfidentialClientApplication({
        auth: {
            clientId: "ENTER_CLIENT_ID",
            authority: "http://login.microsoftonline.com/ENTER_TENANT_ID"
            cloudDiscoveryMetadata: "PROVIDE_STRINGIFIED_DISCOVERY_METADATA"
            authorityMetadata: "PROVIDE_STRINGIFIED_AUTHORITY_METADATA"
        },
        cache: {
            cachePlugin: new CustomCachePlugin(
                this.cacheClientWrapper,
                partitionKey
            )
        }
    });
};

async function getToken(tokenRequest: OnBehalfOfRequest): Promise<AuthenticationResult | null> {
    const partitionKey = await this.cryptoProvider.hashString(tokenRequest.oboAssertion);

    const cca = getMsalInstance(partitionKey);

    let tokenResponse = null;

    try {
        await cca.getTokenCache().getAllAccounts(); // required for cache read
        tokenResponse = await cca.acquireTokenOnBehalfOf(tokenRequest);
    } catch (error) {
        throw error;
    }

    return tokenResponse;
};

Zie (CCA) Web API met een aangepaste plug-in voor een gedistribueerde cache voor meer informatie.

Zie ook