Ćwiczenie — logowanie użytkowników przy użyciu biblioteki MSAL
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:
Utwórz folder dla aplikacji.
mkdir ~/javawebappSklonuj przykładową aplikację z repozytorium GitHub do nowego folderu.
git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebappPrzejdź 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.
Otwórz plik ./src/main/resources/authentication.properties.
aad.authorityW 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.aad.clientIdWe właściwości znajdź ciąg{enter-your-client-id-here}i zastąp istniejącą wartość wartością Identyfikator aplikacji (klienta) —clientIdwartość — zarejestrowaną aplikację skopiowaną z witryny Azure Portal.
aad.secretWe 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
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.Skompiluj i spakuj projekt przy użyciu narzędzia Maven:
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean packageZnajdź 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.
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:
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.
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>Pierwszym krokiem procesu logowania jest wysłanie żądania do punktu końcowego dzierżawy
/authorizefirmy Microsoft Entra. Wystąpienie MSAL4JConfidentialClientApplicationjest 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 implementacjiredirectToAuthorizationEndpointmetody wAuthHelperklasie.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 elementuAuthorizationRequestUrl. -
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 zakresyopenid profile offline_accesssą wystarczające do otrzymania odpowiedzi tokenu identyfikatora dla logowania użytkownika i są ustawiane domyślnie przez bibliotekę MSAL.
-
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
ConfidentialClientApplicationwystąpienie wymienia ten kod autoryzacji dla tokenu identyfikatora i tokenu dostępu z identyfikatora Entra firmy Microsoft. Poniższy kod jest fragmentem implementacjiprocessAADCallbackmetody wAuthHelperklasie.// 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.
-
W przypadku
acquireTokenpomyślnego wyodrębnienia oświadczeń tokenu. Jeśli sprawdzanie nie jest sprawdzane, wyniki są umieszczane wcontext— wystąpieniuIdentityContextData— i zapisywane w sesji. Następnie aplikacja może utworzyć wystąpienie z poziomu sesji — za pomocą wystąpienia klasyIdentityContextAdapterServlet— 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());