Ć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 ~/javawebapp
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
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.
Otwórz plik ./src/main/resources/authentication.properties.
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.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.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
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 package
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.
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
/authorize
firmy Microsoft Entra. Wystąpienie MSAL4JConfidentialClientApplication
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 implementacjiredirectToAuthorizationEndpoint
metody wAuthHelper
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 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_access
są 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
ConfidentialClientApplication
wystąpienie wymienia ten kod autoryzacji dla tokenu identyfikatora i tokenu dostępu z identyfikatora Entra firmy Microsoft. Poniższy kod jest fragmentem implementacjiprocessAADCallback
metody wAuthHelper
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.
W przypadku
acquireToken
pomyś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());