Acquérir un jeton d’accès dans votre application web Node.js
S’applique à : Locataires de main-d’œuvre 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
- Suivez les étapes décrites dans la première partie de cette série de guides, Préparer un locataire externe à appeler une API dans une application web Node.js.
- Suivez les étapes de la deuxième partie de cette série de guides, Préparer l’application pour appeler une API dans une application web Node.js.
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.