Uzyskiwanie tokenu dostępu w aplikacji internetowej Node.js
Dotyczy: Dzierżawcy siły roboczej — dzierżawcy zewnętrzni (dowiedz się więcej)
W tym artykule zaktualizujesz kod, aby umożliwić aplikacji internetowej uzyskanie tokenu dostępu. Biblioteka Microsoft Authentication Library (MSAL) dla środowiska Node upraszcza dodawanie uwierzytelniania i autoryzacji do aplikacji internetowej węzła. Ten artykuł jest trzecią częścią czteroczęściowej serii przewodników.
Wymagania wstępne
- Wykonaj kroki opisane w pierwszej części tej serii przewodników Przygotowywanie dzierżawy zewnętrznej do wywoływania interfejsu API w aplikacji internetowej Node.js.
- Wykonaj kroki opisane w drugiej części tej serii przewodników Przygotowywanie aplikacji do wywoływania interfejsu API w aplikacji internetowej Node.js.
Aktualizowanie obiektu konfiguracji biblioteki MSAL
W edytorze kodu otwórz plik authConfig.js , a następnie zaktualizuj kod, dodając protectedResources
obiekt:
//..
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,
//..
};
W pliku authConfig.js zastąp Enter_the_Web_Api_Application_Id_Here
ciąg identyfikatorem aplikacji (klienta) aplikacji internetowej interfejsu API zarejestrowanej w dzierżawie klienta.
Zmienne todolistReadScope
i todolistReadWriteScope
przechowują adresy URL pełnego zakresu internetowego interfejsu API ustawione w dzierżawie zewnętrznej. Upewnij się, że obiekt został wyeksportowany protectedResources
.
Uzyskiwanie tokenu dostępu
W edytorze kodu otwórz plik auth/AuthProvider.js , a następnie zaktualizuj metodę getToken
AuthProvider
w klasie:
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);
}
};
}
//...
}
Najpierw funkcja próbuje uzyskać token dostępu w trybie dyskretnym (bez monitowania użytkownika o poświadczenia):
const silentRequest = { account: req.session.account, scopes: scopes, }; const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
Jeśli pomyślnie uzyskasz token w trybie dyskretnym, zapisz go w sesji. Token jest pobierany z sesji podczas wywoływania interfejsu API.
req.session.accessToken = tokenResponse.accessToken;
Jeśli nie możesz uzyskać tokenu w trybie dyskretnym (na przykład z
InteractionRequiredAuthError
wyjątkiem), zażądaj tokenu dostępu na nowo.
Uwaga
Gdy aplikacja kliencka otrzyma token dostępu, powinien traktować go jako nieprzezroczystym ciągiem. Token dostępu jest przeznaczony dla interfejsu API, a nie dla aplikacji klienckiej. W związku z tym aplikacja kliencka nie powinna próbować odczytywać ani przetwarzać tokenu dostępu. Zamiast tego powinien zawierać token dostępu, który znajduje się w nagłówku Autoryzacja żądań do interfejsu API. Interfejs API jest odpowiedzialny za interpretowanie tokenu dostępu i używanie go do uwierzytelniania i autoryzacji żądań aplikacji klienckiej.