Condividi tramite


Acquisire un token di accesso nell'app Web Node.js

Applicabile a: Cerchio bianco con un simbolo X grigio. Tenant esterni della forza lavoro Cerchio verde con un segno di spunta bianco all'interno. (altre informazioni)

In questo articolo si aggiorna il proprio codice per consentire all'app Web di acquisire un token di accesso. Si usa Microsoft Authentication Library (MSAL) per Node per semplificare l'aggiunta di autenticazione e autorizzazione all'applicazione Web node. Questo articolo è la terza parte di una serie di guide di quattro parti.

Prerequisiti

Aggiornare l'oggetto di configurazione MSAL

Nell'editor di codice, aprire il file authConfig.js, quindi aggiornare il codice aggiungendo l'oggetto protectedResources:

    //..   
    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,
        //..
    };

Nel file authConfig.js, sostituire Enter_the_Web_Api_Application_Id_Here con l'ID applicazione (client) dell'app per le API Web registrata nel tenant del cliente.

Le variabili todolistReadScope e todolistReadWriteScope contengono gli URL di ambito completo dell'API Web impostati nel tenant esterno. Assicurarsi di esportare l'oggetto protectedResources.

Acquisire il token di accesso

Nell'editor di codice, aprire il file auth/AuthProvider.js, quindi aggiornare il metodo getToken nella classe AuthProvider:

    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);
                }
            };
        }
    //...
    }
  • Prima di tutto, la funzione tenta di acquisire automaticamente un token di accesso (senza richiedere le credenziali all’utente):

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Se si acquisisce silenziosamente un token, archiviarlo in una sessione. Il token viene recuperato dalla sessione quando si chiama un'API.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Se non si riesce ad acquisire silenziosamente il token (ad esempio, con eccezione InteractionRequiredAuthError), richiedere un token di accesso non aggiornato.

Nota

Quando l'applicazione client riceve un token di accesso, deve considerarlo come stringa opaca. Il token di accesso è destinato all'API, non all'applicazione client. Pertanto, l'applicazione client non deve tentare di leggere o elaborare il token di accesso. Deve invece includere il token di accesso così come è nell'intestazione Autorizzazione delle proprie richieste all'API. L'API è responsabile dell'interpretazione del token di accesso e del suo uso per autenticare e autorizzare le richieste dell'applicazione client.

Passaggio successivo