Een toegangstoken verkrijgen in uw Node.js-web-app
Van toepassing op: Externe tenants 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
- Voltooi de stappen in het eerste deel van deze handleidingreeks, Bereid externe tenant voor om een API aan te roepen in een Node.js-webtoepassing.
- Voer de stappen in het tweede deel van deze handleidingreeks uit. Bereid de app voor om een API aan te roepen in een Node.js-webtoepassing.
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.