Udostępnij za pośrednictwem


Uzyskiwanie tokenu dostępu w aplikacji internetowej Node.js

Dotyczy:Biały okrąg z szarym symbolem X.Dzierżawcy siły roboczej — dzierżawcy zewnętrzni Zielony okrąg z białym symbolem znacznika wyboru. (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

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ę getTokenAuthProvider 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.

Następny krok