Cvičení – přihlášení uživatelů pomocí MSAL
V tomto cvičení použijete knihovnu Microsoft Authentication Library for Java (MSAL4J) k přidání ověřování do ukázkové webové aplikace v Javě a umožníte uživatelům přihlásit se pomocí svých účtů Microsoft Entra.
Ukázková aplikace, kterou používáte v tomto cvičení, je aplikace Java servlet, která umožňuje uživatelům přihlásit se a zobrazit uživatelské jméno a základní informace o profilu. Umožňuje také volat rozhraní Microsoft Graph API, aby se zobrazily některé informace o uživateli.
Vytvoření webové aplikace v Javě
Z prostředí nebo příkazového řádku:
Vytvořte složku pro aplikaci.
mkdir ~/javawebapp
Naklonujte ukázkovou aplikaci z úložiště GitHub do nové složky.
git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
Přejděte do složky, ve které se nachází ukázková aplikace pro toto cvičení.
cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
Konfigurace aplikace
Pokud chcete kód nakonfigurovat, otevřete projekt aplikace v preferovaném integrovaném vývojovém prostředí, jako je IntelliJ nebo VS Code.
Otevřete soubor ./src/main/resources/authentication.properties.
aad.authority
Ve vlastnosti vyhledejte řetězec{enter-your-tenant-id-here}
. Nahraďte existující hodnotu hodnotou ID adresáře (tenanta), jak je znázorněno na následujícím obrázku, protože aplikace byla zaregistrována pouze s účty v tomto organizačním adresáři .aad.clientId
Ve vlastnosti vyhledejte řetězec{enter-your-client-id-here}
a nahraďte existující hodnotu hodnotou ID aplikace (klienta) –clientId
hodnota – zaregistrované aplikace zkopírované z webu Azure Portal.aad.secret
Ve vlastnosti vyhledejte řetězec{enter-your-client-secret-here}
a nahraďte existující hodnotu hodnotou klíče, kterou jste uložili při vytváření aplikace na webu Azure Portal.
Spuštění aplikace
Ujistěte se, že je server Tomcat spuštěný a máte oprávnění k nasazení webové aplikace. Ujistěte se, že adresa hostitele serveru je
http://localhost:8080
.Zkompilujte a zabalte projekt pomocí Mavenu:
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean package
Najděte výsledný soubor .war na adrese ./target/msal4j-servlet-graph.war. Pokud chcete soubor .war nasadit do Tomcatu, zkopírujte tento soubor .war do adresáře /webapps/ v instalačním adresáři Tomcat a spusťte server Tomcat.
Otevřete prohlížeč a přejděte na
http://localhost:8080/msal4j-servlet-graph/
. Budete přesměrováni, abyste se přihlásili pomocí Microsoft Entra ID. Při úspěšném přihlášení by se měla zobrazit stránka podobná této:Výběrem tlačítka Podrobnosti tokenu ID zobrazíte některé dekódované deklarace identity tokenu ID.
Přehled ověřovacího kódu
Většinu ověřovacího kódu najdete v ukázkové aplikaci v adresáři projektu java/com/microsoft/azuresamples/msal4j/
. Obsahuje několik servletů, které poskytují koncové body ověřování v aplikaci pro přihlášení, odhlášení a zpracování zpětného volání přesměrování z Microsoft Entra ID. Tyto servlety používají pomocné třídy v adresáři java/com/microsoft/azuresamples/msal4j/helpers/ k volání metod ověřování poskytovaných knihovnou MSAL. Existuje filtr servletu definovaný v AuthenticationFilter.java
tom, že přesměruje neověřené požadavky na chráněné trasy na chybovou stránku 401 neautorizovaného protokolu HTTP.
Pokud chcete do aplikace přidat ověřování, musíte do svých projektů zahrnout třídy servletu a java/com/microsoft/azuresamples/msal4j/authservlets
java/com/microsoft/azuresamples/msal4j/authwebapp
adresáře, pomocné třídy v adresáři java/com/microsoft/azuresamples/msal4j/helpers/ a filtr AuthenticationFilter.java
servletu ověřování. Tady jsou další podrobnosti o ověřovacím kódu MSAL.
MSAL4J je k dispozici na Mavenu. Do souboru pom.xml projektu musíte přidat MSAL4J jako závislost:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.17.2</version> </dependency>
Prvním krokem procesu přihlášení je odeslání požadavku na koncový bod tenanta
/authorize
Microsoft Entra. Instance MSAL4JConfidentialClientApplication
se využívá k vytvoření adresy URL žádosti o autorizaci. Aplikace přesměruje prohlížeč na tuto adresu URL, což je místo, kde se uživatel přihlásí. Následující kód je výňatek z implementaceredirectToAuthorizationEndpoint
metody veAuthHelper
třídě.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, které musí být nastaveny k sestavení .AuthorizationRequestUrl
-
REDIRECT_URI
: Identifikátor URI přesměrování je identifikátor URI, na který zprostředkovatel identity odesílá tokeny zabezpečení zpět. Microsoft Entra ID přesměruje prohlížeč – spolu s ověřovacím kódem – na tento identifikátor URI po shromáždění přihlašovacích údajů uživatele. Musí odpovídat identifikátoru URI přesměrování v registraci aplikace Microsoft Entra. -
SCOPES
: Obory jsou oprávnění požadovaná aplikací. Za normálních okolností stačí tři oboryopenid profile offline_access
pro přijetí odpovědi tokenu ID pro přihlášení uživatele a ve výchozím nastavení se nastaví službou MSAL.
-
Uživateli se zobrazí výzva k přihlášení pomocí ID Microsoft Entra. Pokud je pokus o přihlášení úspěšný, prohlížeč uživatele se přesměruje do koncového bodu přesměrování aplikace s platným autorizačním kódem v koncovém bodu. Instance
ConfidentialClientApplication
pak tento autorizační kód pro token ID a přístupový token vymění z Microsoft Entra ID. Následující kód je výňatek z implementaceprocessAADCallback
metody veAuthHelper
třídě.// 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, které musí být nastaveny pro výměnu autorizačního kódu pro ID nebo přístupový token. -
authCode
: Autorizační kód přijatý v koncovém bodu přesměrování. -
REDIRECT_URI
: Identifikátor URI přesměrování použitý v předchozím kroku musí být znovu předán. -
SCOPES
: Obory použité v předchozím kroku musí být předány znovu.
-
Pokud
acquireToken
je deklarace identity tokenu úspěšné, extrahují se. Pokud kontrola nesouvisení projde, výsledky se umístí docontext
instanceIdentityContextData
relace a uloží se do relace. Aplikace pak může vytvořit instanci z relace – prostřednictvím instance –IdentityContextAdapterServlet
kdykoli k ní potřebuje přístup:// 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());