Delen via


Een toegangstoken verkrijgen in uw Node.js-web-app

Van toepassing op:Witte cirkel met een grijs X-symbool. Externe tenantsGroene cirkel met een wit vinkje. van werknemers (meer informatie)

In dit artikel werkt u uw code bij, zodat uw web-app een toegangstoken kan verkrijgen. U gebruikt Microsoft Authentication Library (MSAL) voor Node om het toevoegen van verificatie en autorisatie aan uw knooppuntwebtoepassing te vereenvoudigen. Dit artikel is het derde deel van een vierdelige gidsserie.

Vereisten

MSAL-configuratieobject bijwerken

Open in de code-editor authConfig.js bestand en werk de code bij door het protectedResources object toe te voegen:

    //..   
    const toDoListReadScope = process.env.TODOLIST_READ || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.Read';
    const toDoListReadWriteScope = process.env.TODOLIST_READWRITE || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.ReadWrite';
    
    const protectedResources = {
        toDoListAPI: {
            endpoint: 'https://localhost:44351/api/todolist',
            scopes: {
                read: [toDoListReadScope],
                write: [toDoListReadWriteScope],
            },
        },
    };    
    module.exports = {
        //..
        protectedResources,
        //..
    };

Vervang in uw authConfig.js bestand door Enter_the_Web_Api_Application_Id_Here de toepassings-id (client) van de web-API-app die u hebt geregistreerd in de tenant van uw klant.

De todolistReadScope en todolistReadWriteScope variabelen bevatten de volledige scope-URL's van de web-API die u in uw externe tenant hebt ingesteld. Zorg ervoor dat u het protectedResources object exporteert.

Toegangstoken verkrijgen

Open in de code-editor het bestand auth/AuthProvider.js en werk vervolgens de getToken methode in de AuthProvider klasse bij:

    const axios = require('axios');
    class AuthProvider {
    //...
        getToken(scopes) {
            return  async function (req, res, next) {
                const msalInstance = authProvider.getMsalInstance(authProvider.config.msalConfig);
                try {
                    msalInstance.getTokenCache().deserialize(req.session.tokenCache);
    
                    const silentRequest = {
                        account: req.session.account,
                        scopes: scopes,
                    };
    
                    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
                    req.session.tokenCache = msalInstance.getTokenCache().serialize();
                    req.session.accessToken = tokenResponse.accessToken;
                    next();
                } catch (error) {
                    if (error instanceof msal.InteractionRequiredAuthError) {
                        req.session.csrfToken = authProvider.cryptoProvider.createNewGuid();
    
                        const state = authProvider.cryptoProvider.base64Encode(
                            JSON.stringify({
                                redirectTo: 'http://localhost:3000/todos',
                                csrfToken: req.session.csrfToken,
                            })
                        );
                        
                        const authCodeUrlRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        const authCodeRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        authProvider.redirectToAuthCodeUrl(
                            req,
                            res,
                            next,
                            authCodeUrlRequestParams,
                            authCodeRequestParams,
                            msalInstance
                        );
                    }
    
                    next(error);
                }
            };
        }
    //...
    }
  • Eerst probeert de functie een toegangstoken op de achtergrond te verkrijgen (zonder de gebruiker om referenties te vragen):

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Als u een token op de achtergrond hebt verkregen, slaat u het op in een sessie. U haalt het token op uit de sessie wanneer u een API aanroept.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Als u het token niet op de achtergrond (zoals met InteractionRequiredAuthError uitzondering) kunt verkrijgen, vraagt u een toegangstoken afresh aan.

Notitie

Zodra uw clienttoepassing een toegangstoken ontvangt, moet deze worden behandeld als een ondoorzichtige tekenreeks. Het toegangstoken is bedoeld voor de API, niet voor de clienttoepassing. Daarom mag de clienttoepassing het toegangstoken niet lezen of verwerken. In plaats daarvan moet het toegangstoken in de autorisatieheader van de aanvragen voor de API worden opgenomen. De API is verantwoordelijk voor het interpreteren van het toegangstoken en het gebruik ervan om de aanvragen van de clienttoepassing te verifiëren en te autoriseren.

Volgende stap