Partager via


Acquérir un jeton d’accès dans votre application web Node.js

S’applique à :Cercle blanc avec un symbole X gris. Locataires de main-d’œuvre Cercle vert avec un symbole de coche blanche. Locataires externes (en savoir plus)

Dans cet article, vous mettez à jour votre code pour permettre à votre application web d’acquérir un jeton d’accès. Vous utilisez la bibliothèque d’authentification Microsoft (MSAL) pour Node pour simplifier l’ajout d’authentification et d’autorisation à votre application web de nœud. Cet article est la troisième partie d’une série de guides en quatre parties.

Prérequis

Mettre à jour l’objet de configuration MSAL

Dans votre éditeur de code, ouvrez le fichier authConfig.js, puis mettez à jour le code en ajoutant l’objet 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,
        //..
    };

Dans votre fichier authConfig.js, remplacez Enter_the_Web_Api_Application_Id_Here par l’ID d’application (client) de l’application API web que vous avez inscrite dans le locataire de votre client.

Les variables todolistReadScope et todolistReadWriteScope contiennent les URL de l’étendue complète de l’API web que vous définissez dans votre locataire externe. Veillez à exporter l’objet protectedResources.

Acquérir un jeton d’accès

Dans votre éditeur de code, ouvrez fichier d’authentification/AuthProvider.js, puis mettez à jour la méthode getToken dans la 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);
                }
            };
        }
    //...
    }
  • Tout d’abord, la fonction tente d’acquérir un jeton d’accès en mode silencieux (sans demander à l’utilisateur ses informations d’identification) :

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Si vous acquérez un jeton en mode silencieux, stockez-le dans une session. Vous récupérez le jeton dans la session lorsque vous appelez une API.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Si vous ne parvenez pas à acquérir le jeton en mode silencieux (par exemple, en recevant l’exception InteractionRequiredAuthError), demandez un jeton d’accès à nouveau.

Remarque

Une fois que votre application cliente reçoit un jeton d’accès, elle doit la traiter comme une chaîne opaque. Le jeton d’accès est destiné à l’API, et non à l’application cliente. Par conséquent, l’application cliente ne doit pas tenter de lire ou de traiter le jeton d’accès. Au lieu de cela, il doit inclure le jeton d’accès tel qu’il se trouve dans l’en-tête d’autorisation de ses demandes à l’API. L’API est chargée d’interpréter le jeton d’accès et de l’utiliser pour authentifier et autoriser les demandes de l’application cliente.

Étape suivante