Freigeben über


Abrufen eines Zugriffstokens in Ihrer Node.js Web App

Gilt für: Grüner Kreis mit einem weißen Häkchensymbol, das angibt, dass der folgende Inhalt für externe Mandanten gilt. Externe Mandanten (weitere Informationen)

In diesem Artikel aktualisieren Sie Ihren Code, damit Ihre Web-App ein Zugriffstoken erhält. Sie verwenden die Microsoft Authentication Library (MSAL) für Node , um das Hinzufügen von Authentifizierung und Autorisierung zu Ihrer Knotenwebanwendung zu vereinfachen. Dieser Artikel ist der dritte Teil einer vierteiligen Führungslinie.

Voraussetzungen

Aktualisieren des MSAL-Konfigurationsobjekts

Öffnen Sie in Ihrem Code-Editor authConfig.js Datei, und aktualisieren Sie den Code, indem Sie das protectedResources Objekt hinzufügen:

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

Ersetzen Sie in Ihrer authConfig.js-Datei Enter_the_Web_Api_Application_Id_Here durch die Anwendungs-ID (Client) der Web-API-App, die Sie im Mandanten Ihres Kunden registriert haben.

Die variablen todolistReadScope und todolistReadWriteScope enthalten die Web-API-URLs, die Sie in Ihrem externen Mandanten festgelegt haben. Stellen Sie sicher, dass Sie das protectedResources Objekt exportieren.

Zugriffstoken abrufen

Öffnen Sie in Ihrem Code-Editor die Authentifizierungs-/AuthProvider.js datei, und aktualisieren Sie dann die getToken Methode in der AuthProvider Klasse:

    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);
                }
            };
        }
    //...
    }
  • Zunächst versucht die Funktion, ein Zugriffstoken im Hintergrund abzurufen (ohne den Benutzer zur Eingabe von Anmeldeinformationen aufzufordern):

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Wenn Sie ein Token erfolgreich unauffällig abrufen, speichern Sie es in einer Session. Sie rufen das Token aus der Sitzung ab, wenn Sie eine API aufrufen.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Wenn Sie das Token nicht lautlos abrufen können (z. B. bei einer InteractionRequiredAuthError-Ausnahme), fordern Sie ein Zugriffstoken erneut an.

Hinweis

Sobald Ihre Clientanwendung ein Zugriffstoken empfängt, sollte sie als undurchsichtige Zeichenfolge behandelt werden. Das Zugriffstoken ist für die API vorgesehen, nicht für die Clientanwendung. Daher sollte die Clientanwendung nicht versuchen, das Zugriffstoken zu lesen oder zu verarbeiten. Stattdessen sollte es das Zugriffstoken as-is in den Autorisierungsheader seiner Anforderungen an die API einschließen. Die API ist für die Interpretation des Zugriffstokens und die Verwendung des Zugriffstokens verantwortlich, um die Anforderungen der Clientanwendung zu authentifizieren und zu autorisieren.

Nächster Schritt