Övning – Logga in användare med MSAL
I den här övningen använder du Microsoft Authentication Library for Java (MSAL4J) för att lägga till autentisering i ett Java-exempelwebbprogram och tillåta användare att logga in med sina Microsoft Entra-konton.
Exempelprogrammet som du använder i den här övningen är ett Java servlet-program som gör det möjligt för användare att logga in och visa användarnamn och grundläggande profilinformation. Du kan också anropa Microsoft Graph API för att visa viss användarinformation.
Skapa ett Java-webbprogram
Från gränssnittet eller kommandoraden:
Skapa en mapp för programmet.
mkdir ~/javawebappKlona exempelprogrammet från GitHub-lagringsplatsen till den nya mappen.
git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebappÄndra till mappen där exempelprogrammet för den här övningen finns.
cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
Konfigurera programmet
Om du vill konfigurera koden öppnar du programprojektet i önskad IDE som IntelliJ eller VS Code.
Öppna filen ./src/main/resources/authentication.properties.
Leta reda på strängen
aad.authority{enter-your-tenant-id-here}i egenskapen . Ersätt det befintliga värdet med ID-värdet för Katalog (klientorganisation) – som visas i följande bild – eftersom appen registrerades med alternativet Konton i den här organisationskatalogen.Leta reda på
aad.clientIdsträngen{enter-your-client-id-here}i egenskapen och ersätt det befintliga värdet med ID-värdet för program (klient) –clientIdvärdet – för det registrerade program som kopierats från Azure Portal.
Leta reda på
aad.secretsträngen{enter-your-client-secret-here}i egenskapen och ersätt det befintliga värdet med det nyckelvärde som du sparade när appen skapades i Azure Portal.
Kör appen
Kontrollera att Tomcat-servern körs och att du har behörighet att distribuera en webbapp till den. Kontrollera att serverns värdadress är
http://localhost:8080.Kompilera och paketera projektet med maven:
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean packageHitta den resulterande .war-filen på ./target/msal4j-servlet-graph.war. Om du vill distribuera till Tomcat kopierar du den här .war-filen till katalogen /webapps/ i tomcat-installationskatalogen och startar Tomcat-servern.
Öppna din webbläsare och gå till
http://localhost:8080/msal4j-servlet-graph/. Du omdirigeras för att logga in med Microsoft Entra-ID. Vid lyckad inloggning bör du se en sida som liknar följande:
Välj knappen ID-tokeninformation för att se några av ID-tokens avkodade anspråk.
Översikt över autentiseringskod
Du hittar det mesta av autentiseringskoden i exempelprogrammet under projektets java/com/microsoft/azuresamples/msal4j/ katalog. Den innehåller flera servletar som tillhandahåller autentiseringsslutpunkterna i programmet för att logga in, logga ut och hantera återanropet från Microsoft Entra-ID. Dessa servlets använder hjälpklasserna i katalogen java/com/microsoft/azuresamples/msal4j/helpers/ för att anropa de autentiseringsmetoder som tillhandahålls av MSAL. Det finns ett servlet-filter definierat i AuthenticationFilter.java som omdirigerar oautentiserade begäranden till skyddade vägar till en 401-felsida för obehörig HTTP.
Om du vill lägga till autentisering i ditt program måste du inkludera servlet-klasserna under java/com/microsoft/azuresamples/msal4j/authservlets och java/com/microsoft/azuresamples/msal4j/authwebapp kataloger, hjälpklasserna i katalogen java/com/microsoft/azuresamples/msal4j/helpers/ och autentiseringsservlet-filtret AuthenticationFilter.java i dina projekt. Här följer mer information om MSAL-autentiseringskoden.
MSAL4J är tillgängligt på Maven. Du måste lägga till MSAL4J som ett beroende i projektets pom.xml-fil :
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.17.2</version> </dependency>Det första steget i inloggningsprocessen är att skicka en begäran till Microsoft Entra-klientorganisationens
/authorizeslutpunkt. MSAL4J-instansenConfidentialClientApplicationanvänds för att skapa en URL för auktoriseringsbegäran. Appen omdirigerar webbläsaren till den här URL:en, där användaren loggar in. Följande kod är ett utdrag från implementeringen avredirectToAuthorizationEndpointmetoden iAuthHelperklassen.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: Parametrar som måste anges för att skapa enAuthorizationRequestUrl. -
REDIRECT_URI: Omdirigerings-URI:n är den URI som identitetsprovidern skickar tillbaka säkerhetstoken till. Microsoft Entra-ID omdirigerar webbläsaren – tillsammans med autentiseringskod – till den här URI:n efter att användarens autentiseringsuppgifter har samlats in. Den måste matcha omdirigerings-URI:n i Microsoft Entra-appregistreringen. -
SCOPES: Omfång är behörigheter som begärs av programmet. Normalt räcker det med de tre omfångenopenid profile offline_accessför att ta emot ett ID-tokensvar för en användarinloggning och anges som standard av MSAL.
-
Användaren får en inloggningsprompt av Microsoft Entra-ID. Om inloggningsförsöket lyckas omdirigeras användarens webbläsare till appens omdirigeringsslutpunkt med en giltig auktoriseringskod i slutpunkten. Instansen
ConfidentialClientApplicationutbyter sedan den här auktoriseringskoden mot en ID-token och åtkomsttoken från Microsoft Entra-ID. Följande kod är ett utdrag från implementeringen avprocessAADCallbackmetoden iAuthHelperklassen.// 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: Parametrar som måste anges för att kunna byta auktoriseringskoden mot ett ID och/eller en åtkomsttoken. -
authCode: Auktoriseringskoden som togs emot vid omdirigeringsslutpunkten. -
REDIRECT_URI: Omdirigerings-URI:n som användes i föregående steg måste skickas igen. -
SCOPES: Omfången som användes i föregående steg måste skickas igen.
-
Om
acquireTokendet lyckas extraheras tokenanspråken. Om nonce-kontrollen godkänns placeras resultatet icontext– en instans avIdentityContextData– och sparas i sessionen. Programmet kan sedan instansiera detta från sessionen – som en instans avIdentityContextAdapterServlet– när det behöver åtkomst till det:// 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());