Cvičení – přihlášení uživatelů pomocí MSAL

Dokončeno

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:

  1. Vytvořte složku pro aplikaci.

    mkdir ~/javawebapp
    
  2. 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
    
  3. 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.

  1. Otevřete soubor ./src/main/resources/authentication.properties.

  2. 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 .

  3. 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.

    Snímek obrazovky se zvýrazněným ID aplikace zaregistrované v Microsoft Entra ID na webu Azure Portal

  4. 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

  1. 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.

  2. Zkompilujte a zabalte projekt pomocí Mavenu:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. 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.

  4. 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:

    Snímek obrazovky zobrazující uživatelské jméno zobrazené na stránce po úspěšném přihlášení k ukázkové aplikaci

  5. 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/authservletsjava/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.

  1. 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>
    
  2. Prvním krokem procesu přihlášení je odeslání požadavku na koncový bod tenanta /authorize Microsoft Entra. Instance MSAL4J ConfidentialClientApplication 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 implementace redirectToAuthorizationEndpoint metody ve AuthHelper 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 obory openid 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.
  3. 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 implementace processAADCallback metody ve AuthHelper 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.
  4. Pokud acquireToken je deklarace identity tokenu úspěšné, extrahují se. Pokud kontrola nesouvisení projde, výsledky se umístí do context instance IdentityContextData 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());