Tokens verkrijgen in MSAL Node

Aangezien MSAL Node verschillende autorisatiecodetoestemmingen ondersteunt, is er ondersteuning voor verschillende openbare API's per toekenning en de bijbehorende aanvraag. In dit artikel worden de verschillende openbare API's beschreven die beschikbaar zijn voor elke stroom en het bijbehorende aanvraagtype. Het wordt sterk aanbevolen om de autorisatiecodestroom voor uw toepassing te implementeren.

Autorisatiecodestroom

Openbare API's

  • getAuthCodeUrl(): Deze API is de eerste stap van de authorization code grant voor MSAL Node. De aanvraag is van het type AuthorizationUrlRequest. De toepassing ontvangt een URL die kan worden gebruikt om een authorization code te genereren. Deze URL kan worden geopend in een browser naar keuze, waar de gebruiker zijn inloggegevens kan invoeren en vervolgens wordt teruggeleid naar de redirectUri (geregistreerd tijdens de app-registratie) met een authorization code. De authorization code kan nu worden ingewisseld voor een token met de volgende stap. Merk op dat als de autorisatiecodeflow wordt gebruikt door een publieke clienttoepassing, PKCE wordt aanbevolen.

  • acquireTokenByCode(): Deze API is de tweede stap van de authorization code grant voor MSAL Node. De hier samengestelde aanvraag moet van het type AuthorizationCodeRequest zijn. De toepassing geeft de authorization code door die als onderdeel van de voorgaande stap is ontvangen en wisselt deze in voor een token. Merk op dat als de autorisatiecodeflow wordt gebruikt door een publieke clienttoepassing, PKCE wordt aanbevolen.


    const authCodeUrlParameters = {
        scopes: ["sample_scope"],
        redirectUri: "your_redirect_uri",
    };

    // get url to sign user in and consent to scopes needed for application
    cca.getAuthCodeUrl(authCodeUrlParameters).then((response) => {
        console.log(response);
    }).catch((error) => console.log(JSON.stringify(error)));

    const tokenRequest = {
        code: "authorization_code",
        redirectUri: "your_redirect_uri",
        scopes: ["sample_scope"],
    };

    // acquire a token by exchanging the code
    cca.acquireTokenByCode(tokenRequest).then((response) => {
        console.log("\nResponse: \n:", response);
    }).catch((error) => {
        console.log(error);
    });

Apparaatcodeproces

Openbare API's

  • acquireTokenByDeviceCode(): met deze API kan de toepassing een token verkrijgen met de device code-toekenning. De aanvraag is van het type DeviceCodeRequest. Deze API verkrijgt een token van de instantie met behulp van de OAuth2.0-apparaatcodestroom. Deze stroom is ontworpen voor apparaten die geen toegang hebben tot een browser of invoerbeperkingen hebben. De autorisatieserver geeft een DeviceCode-object uit met een verificatiecode, een eindgebruikercode en de verificatie-URI van de eindgebruiker. Het DeviceCode-object wordt geleverd via een callback en de eindgebruiker moet worden geïnstrueerd om een ander apparaat te gebruiken om naar de verificatie-URI te navigeren om referenties in te voeren. Omdat de client geen binnenkomende aanvragen kan ontvangen, wordt de autorisatieserver herhaaldelijk gepeild totdat de eindgebruiker de invoer van referenties heeft voltooid.
const msalConfig = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
    }
};

const pca = new msal.PublicClientApplication(msalConfig);

const deviceCodeRequest = {
    deviceCodeCallback: (response) => (console.log(response.message)),
    scopes: ["user.read"],
};

pca.acquireTokenByDeviceCode(deviceCodeRequest).then((response) => {
    console.log(JSON.stringify(response));
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Tokenstroom vernieuwen

Openbare API's

  • acquireTokenByRefreshToken: Met deze API wordt een token verkregen door het vernieuwingstoken uit te wisselen dat is opgegeven voor een nieuwe set tokens. De aanvraag is van het type RefreshTokenRequest. De refresh token waarde wordt nooit geretourneerd aan de gebruiker in een antwoord, maar kan worden geopend vanuit de gebruikerscache. Het wordt aanbevolen om te gebruiken acquireTokenSilent() voor niet-interactieve scenario's. Wanneer u acquireTokenSilent() gebruikt, verwerkt MSAL automatisch de caching en het vernieuwen van tokens.
const config = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
    }
};

const pca = new msal.PublicClientApplication(config);

const refreshTokenRequest = {
    refreshToken: "",
    scopes: ["user.read"],
};

pca.acquireTokenByRefreshToken(refreshTokenRequest).then((response) => {
    console.log(JSON.stringify(response));
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Stille stroom

Openbare API's

  • acquireTokenSilent: Deze API verkrijgt geruisloos een token als de cache door de gebruiker wordt opgegeven, of wanneer de cache wordt aangemaakt door vóór deze aanroep een andere interactieve flow uit te voeren (bijvoorbeeld de autorisatiecodeflow). De aanvraag is van het type SilentFlowRequest. De token wordt op de achtergrond verkregen wanneer een gebruiker het account opgeeft waarvoor het token wordt aangevraagd.
/**
 * Cache Plugin configuration
 */
const cachePath = "path_to_your_cache_file/msal_cache.json"; // Replace this string with the path to your valid cache file.

const readFromStorage = () => {
    return fs.readFile(cachePath, "utf-8");
};

const writeToStorage = (getMergedState) => {
    return readFromStorage().then(oldFile =>{
        const mergedState = getMergedState(oldFile);
        return fs.writeFile(cachePath, mergedState);
    })
};

const cachePlugin = {
    readFromStorage,
    writeToStorage
};

/**
 * Public Client Application Configuration
 */
const publicClientConfig = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
        redirectUri: "your_redirectUri_here",
    },
    cache: {
        cachePlugin
    },
};

/** Request Configuration */

const scopes = ["your_scopes"];

const authCodeUrlParameters = {
    scopes: scopes,
    redirectUri: "your_redirectUri_here",
};

const pca = new msal.PublicClientApplication(publicClientConfig);
const msalCacheManager = pca.getCacheManager();
let accounts;

pca.getAuthCodeUrl(authCodeUrlParameters)
    .then((response) => {
        console.log(response);
    }).catch((error) => console.log(JSON.stringify(error)));

const tokenRequest = {
    code: req.query.code,
    redirectUri: "http://localhost:3000/redirect",
    scopes: scopes,
};

pca.acquireTokenByCode(tokenRequest).then((response) => {
    console.log("\nResponse: \n:", response);
    return msalCacheManager.writeToPersistence();
}).catch((error) => {
    console.log(error);
});

// get Accounts
accounts = msalCacheManager.getAllAccounts();

// Build silent request
const silentRequest = {
    account: accounts[0], // You would filter accounts to get the account you want to get tokens for
    scopes: scopes,
};

// Acquire Token Silently to be used in MS Graph call
pca.acquireTokenSilent(silentRequest).then((response) => {
    console.log("\nSuccessful silent token acquisition:\nResponse: \n:", response);
    return msalCacheManager.writeToPersistence();
}).catch((error) => {
        console.log(error);
});

Stroom voor clientreferenties

Openbare API's

  • acquireTokenByClientCredential: Deze API verkrijgt een token met behulp van de referenties van de vertrouwelijke clienttoepassing om te verifiëren (in plaats van een gebruiker te imiteren) bij het aanroepen van een andere webservice. In dit scenario is de client doorgaans een webservice in de middelste laag, een daemon-service of een back-endwebtoepassing. Voor een hoger zekerheidsniveau laat het Microsoft Identity-platform ook toe dat de aanroepende service een certificaat gebruikt als referentie (in plaats van een gedeeld geheim). De aanvraag is van het type ClientCredentialRequest.

Geheimen veilig gebruiken

Geheimen mogen nooit hardcoded worden. Het dotenv npm-pakket kan worden gebruikt voor het opslaan van geheimen in een .env-bestand (in de hoofdmap van het project) dat moet worden opgenomen in .gitignore om onbedoelde uploads van de geheimen te voorkomen.

import "dotenv/config"; // process.env now has the values defined in a .env file

const config = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
        clientSecret: process.env.clientSecret
    }
};

// Create msal application object
const cca = new msal.ConfidentialClientApplication(config);

// With client credentials flows permissions need to be granted in the portal by a tenant administrator.
// The scope is always in the format "<resource>/.default"
const clientCredentialRequest = {
    scopes: ["https://graph.microsoft.com/.default"], // replace with your resource
};

cca.acquireTokenByClientCredential(clientCredentialRequest).then((response) => {
    console.log("Response: ", response);
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Namens Flow

  • acquireTokenOnBehalfOf: Deze API implementeert de On Behalf Of Flow, die wordt gebruikt wanneer een toepassing een service/web-API aanroept, die op zijn beurt een andere service/web-API moet aanroepen die gebruikmaakt van een andere verificatiestroom (apparaatcode, gebruikersnaam/wachtwoord, enzovoort). Het toegangstoken wordt in eerste instantie verkregen door de web-API (door een van de web-API-stromen) en de web-API kan dit token vervolgens uitwisselen voor een ander token via OBO. De aanvraag is van het type OnBehalfOfRequest

Bekijk het voorbeeld van de On Behalf Of-stroom voor gebruiksinstructies: