Ćwiczenie — logowanie użytkowników przy użyciu biblioteki MSAL

Ukończone

W tym ćwiczeniu użyjesz biblioteki Microsoft Authentication Library for Java (MSAL4J), aby dodać uwierzytelnianie w przykładowej aplikacji internetowej Java i zezwolić użytkownikom na logowanie się przy użyciu kont microsoft Entra.

Przykładowa aplikacja używana w tym ćwiczeniu to aplikacja serwletu Java, która umożliwia użytkownikom logowanie się i wyświetlanie nazwy użytkownika i podstawowych informacji o profilu. Umożliwia również wywołanie interfejsu API programu Microsoft Graph w celu wyświetlenia niektórych informacji o użytkowniku.

Tworzenie aplikacji internetowej w języku Java

Z powłoki lub wiersza polecenia:

  1. Utwórz folder dla aplikacji.

    mkdir ~/javawebapp
    
  2. Sklonuj przykładową aplikację z repozytorium GitHub do nowego folderu.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Przejdź do folderu, w którym znajduje się przykładowa aplikacja dla tego ćwiczenia.

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

Konfigurowanie aplikacji

Aby skonfigurować kod, otwórz projekt aplikacji w preferowanym środowisku IDE, na przykład IntelliJ lub VS Code.

  1. Otwórz plik ./src/main/resources/authentication.properties.

  2. aad.authority W właściwości znajdź ciąg {enter-your-tenant-id-here}. Zastąp istniejącą wartość wartością Identyfikator katalogu (dzierżawy) — jak pokazano na poniższej ilustracji — ponieważ aplikacja została zarejestrowana w opcji Tylko konta w tym katalogu organizacyjnym.

  3. aad.clientId We właściwości znajdź ciąg {enter-your-client-id-here} i zastąp istniejącą wartość wartością Identyfikator aplikacji (klienta) — clientId wartość — zarejestrowaną aplikację skopiowaną z witryny Azure Portal.

    Zrzut ekranu przedstawiający identyfikator aplikacji zarejestrowanej w usłudze Microsoft Entra ID w witrynie Azure Portal.

  4. aad.secret We właściwości znajdź ciąg {enter-your-client-secret-here} i zastąp istniejącą wartość wartością klucza zapisaną podczas tworzenia aplikacji w witrynie Azure Portal.

Uruchamianie aplikacji

  1. Upewnij się, że serwer Tomcat jest uruchomiony i masz uprawnienia do wdrażania aplikacji internetowej. Upewnij się, że adres hosta serwera to http://localhost:8080.

  2. Skompiluj i spakuj projekt przy użyciu narzędzia Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Znajdź wynikowy plik war w pliku ./target/msal4j-servlet-graph.war. Aby wdrożyć program Tomcat, skopiuj ten plik war do katalogu /webapps/ w katalogu instalacyjnym serwera Tomcat i uruchom serwer Tomcat.

  4. Otwórz przeglądarkę i przejdź do http://localhost:8080/msal4j-servlet-graph/adresu . Nastąpi przekierowanie w celu zalogowania się przy użyciu identyfikatora Entra firmy Microsoft. Po pomyślnym zalogowaniu powinna zostać wyświetlona strona podobna do następującej:

    Zrzut ekranu przedstawiający nazwę użytkownika wyświetlaną na stronie po pomyślnym zalogowaniu się do przykładowej aplikacji.

  5. Wybierz przycisk Szczegóły tokenu identyfikatora, aby wyświetlić niektóre zdekodowane oświadczenia tokenu identyfikatora.

Omówienie kodu uwierzytelniania

Większość kodu uwierzytelniania można znaleźć w przykładowej aplikacji w katalogu projektu java/com/microsoft/azuresamples/msal4j/ . Zawiera on wiele serwletów, które zapewniają punkty końcowe uwierzytelniania w aplikacji do logowania, wylogowywania i obsługi wywołania zwrotnego przekierowania z identyfikatora Entra firmy Microsoft. Te serwlety używają klas pomocników w katalogu java/com/microsoft/azuresamples/msal4j/helpers/ w celu wywołania metod uwierzytelniania dostarczonych przez bibliotekę MSAL. Istnieje filtr serwletu zdefiniowany w AuthenticationFilter.java tym pliku, który przekierowuje nieuwierzytelnione żądania do chronionych tras do strony błędu HTTP 401 nieautoryzowanego.

Aby dodać uwierzytelnianie do aplikacji, należy uwzględnić klasy serwletu w obszarze java/com/microsoft/azuresamples/msal4j/authservlets i java/com/microsoft/azuresamples/msal4j/authwebapp katalogach, klasy pomocnika w katalogu java/com/microsoft/azuresamples/msal4j/helpers/ oraz filtr AuthenticationFilter.java serwletu uwierzytelniania w projektach. Poniżej przedstawiono więcej szczegółów kodu uwierzytelniania biblioteki MSAL.

  1. Biblioteka MSAL4J jest dostępna w narzędziu Maven. Musisz dodać bibliotekę MSAL4J jako zależność w pliku pom.xml projektu:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. Pierwszym krokiem procesu logowania jest wysłanie żądania do punktu końcowego dzierżawy /authorize firmy Microsoft Entra. Wystąpienie MSAL4J ConfidentialClientApplication jest używane do konstruowania adresu URL żądania autoryzacji. Aplikacja przekierowuje przeglądarkę do tego adresu URL, w którym loguje się użytkownik. Poniższy kod jest fragmentem implementacji redirectToAuthorizationEndpoint metody w AuthHelper klasie.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
                                                        .builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
                                                        .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    
    • AuthorizationRequestUrlParameters: parametry, które należy ustawić w celu skompilowania elementu AuthorizationRequestUrl.
    • REDIRECT_URI: identyfikator URI przekierowania to identyfikator URI, do który dostawca tożsamości wysyła tokeny zabezpieczające. Identyfikator Entra firmy Microsoft przekierowuje przeglądarkę — wraz z kodem uwierzytelniania — do tego identyfikatora URI po zebraniu poświadczeń użytkownika. Musi być zgodny z identyfikatorem URI przekierowania w rejestracji aplikacji Microsoft Entra.
    • SCOPES: Zakresy są uprawnieniami żądanymi przez aplikację. Zwykle trzy zakresy openid profile offline_access są wystarczające do otrzymania odpowiedzi tokenu identyfikatora dla logowania użytkownika i są ustawiane domyślnie przez bibliotekę MSAL.
  3. Użytkownik jest wyświetlany z monitem logowania przez microsoft Entra ID. Jeśli próba logowania zakończy się pomyślnie, przeglądarka użytkownika zostanie przekierowana do punktu końcowego przekierowania aplikacji z prawidłowym kodem autoryzacji w punkcie końcowym. Następnie ConfidentialClientApplication wystąpienie wymienia ten kod autoryzacji dla tokenu identyfikatora i tokenu dostępu z identyfikatora Entra firmy Microsoft. Poniższy kod jest fragmentem implementacji processAADCallback metody w AuthHelper klasie.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    
    • AuthorizationCodeParameters: Parametry, które należy ustawić w celu wymiany kodu autoryzacji dla identyfikatora i/lub tokenu dostępu.
    • authCode: kod autoryzacji, który został odebrany w punkcie końcowym przekierowania.
    • REDIRECT_URI: Identyfikator URI przekierowania użyty w poprzednim kroku musi zostać ponownie przekazany.
    • SCOPES: zakresy używane w poprzednim kroku muszą zostać ponownie przekazane.
  4. W przypadku acquireToken pomyślnego wyodrębnienia oświadczeń tokenu. Jeśli sprawdzanie nie jest sprawdzane, wyniki są umieszczane w context — wystąpieniu IdentityContextData — i zapisywane w sesji. Następnie aplikacja może utworzyć wystąpienie z poziomu sesji — za pomocą wystąpienia klasy IdentityContextAdapterServlet — zawsze, gdy potrzebuje do niej dostępu:

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());