Упражнение. Вход пользователей с помощью MSAL

Завершено

В этом упражнении вы используете библиотеку проверки подлинности Майкрософт для Java (MSAL4J), чтобы добавить проверку подлинности в примере веб-приложения Java и разрешить пользователям входить с помощью учетных записей Microsoft Entra.

Пример приложения, используемого в этом упражнении, — это приложение сервлета Java, которое позволяет пользователям входить и отображать имя пользователя и основные сведения о профиле. Оно также позволяет вызывать API Microsoft Graph для отображения некоторых сведений о пользователях.

Создание веб-приложения Java

Из оболочки или командной строки:

  1. Создайте папку для приложения.

    mkdir ~/javawebapp
    
  2. Клонируйте пример приложения из репозитория GitHub в новую папку.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Перейдите в папку, в которой находится пример приложения для этого упражнения.

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

Настройка веб-приложения

Чтобы настроить код, откройте проект приложения в любой среде IDE, например IntelliJ или VS Code.

  1. Откройте файл ./src/main/resources/authentication.properties.

  2. В свойстве aad.authority найдите строку {enter-your-tenant-id-here}. Замените существующее значение значением идентификатора каталога (клиента), как показано на следующем рисунке, так как приложение было зарегистрировано в учетных записях в этом каталоге организации.

  3. В свойстве aad.clientId найдите строку {enter-your-client-id-here} и замените существующее значение значением идентификатораприложения (клиента) — clientId значением зарегистрированного приложения, скопированного из портал Azure.

    Снимок экрана: идентификатор приложения, зарегистрированного в идентификаторе Microsoft Entra в портал Azure.

  4. В свойстве aad.secret найдите строку {enter-your-client-secret-here} и замените существующее значение значением ключа, сохраненным во время создания приложения в портал Azure.

Выполнение приложения

  1. Убедитесь, что сервер Tomcat работает и у вас есть права на развертывание на нем веб-приложения. Убедитесь, что адрес узла сервера — http://localhost:8080.

  2. Скомпилируйте и упакуйте проект с помощью Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Найдите полученный war-файл в ./target/msal4j-servlet-graph.war. Чтобы развернуть в Tomcat, скопируйте этот WAR-файлв каталог /webapps/ в каталог установки Tomcat и запустите сервер Tomcat.

  4. Откройте браузер и перейдите по адресу http://localhost:8080/msal4j-servlet-graph/. Вы перенаправляетесь для входа с помощью идентификатора Microsoft Entra. При успешном входе вы увидите следующую страницу:

    Снимок экрана: имя пользователя, отображаемое на странице после успешного входа в пример приложения.

  5. Нажмите кнопку "Сведения о маркере идентификатора", чтобы просмотреть некоторые декодированные утверждения маркера идентификатора.

Общие сведения о коде проверки подлинности

Большую часть кода проверки подлинности можно найти в примере приложения в каталоге проекта java/com/microsoft/azuresamples/msal4j/ . Он содержит несколько сервлетов, которые предоставляют конечные точки проверки подлинности в приложении для входа, выхода из системы и обработки обратного вызова перенаправления из идентификатора Microsoft Entra. Эти вспомогательные классы используют вспомогательные классы в каталоге java/com/microsoft/azuresamples/msal4j/helpers/ для вызова методов проверки подлинности, предоставляемых MSAL. Существует фильтр сервлета, определенный в AuthenticationFilter.java том, что перенаправляет неавторизованные запросы на защищенные маршруты на страницу несанкционированной ошибки HTTP 401.

Чтобы добавить проверку подлинности в приложение, необходимо включить классы java/com/microsoft/azuresamples/msal4j/authservlets сервлетов в каталог и java/com/microsoft/azuresamples/msal4j/authwebapp каталоги, вспомогательные классы в каталоге java/com/microsoft/azuresamples/msal4j/helpers/ и фильтр AuthenticationFilter.java сервлета проверки подлинности в проектах. Ниже приведены дополнительные сведения о коде проверки подлинности MSAL.

  1. Библиотека MSAL4J доступна в Maven. Необходимо добавить MSAL4J в качестве зависимости в файле pom.xml проекта:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. Первым шагом процесса входа является отправка запроса в конечную точку клиента /authorize Microsoft Entra. Для создания URL-адреса запроса авторизации используется экземпляр MSAL4J ConfidentialClientApplication. Приложение перенаправляет браузер на этот URL-адрес, где пользователь входит в систему. Следующий код представляет собой фрагмент реализации redirectToAuthorizationEndpoint метода в AuthHelper классе.

    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: параметры, которые должны быть заданы для сборки AuthorizationRequestUrl.
    • REDIRECT_URI: URI перенаправления — это универсальный код ресурса (URI), в который поставщик удостоверений отправляет маркеры безопасности. Идентификатор Microsoft Entra перенаправляет браузер вместе с кодом проверки подлинности в этот универсальный код ресурса (URI) после сбора учетных данных пользователя. Он должен соответствовать URI перенаправления в регистрации приложения Microsoft Entra.
    • SCOPES: области — это разрешения, запрашиваемые приложением. Обычно трех областей openid profile offline_access достаточно для получения ответа маркера идентификации для входа пользователя. Они задаются MSAL по умолчанию.
  3. Пользователь предоставляет запрос на вход с помощью идентификатора Microsoft Entra. Если попытка входа прошла успешно, браузер пользователя перенаправляется в конечную точку перенаправления приложения с действительным кодом авторизации в конечной точке. Затем ConfidentialClientApplication экземпляр обменивается этим кодом авторизации для маркера идентификатора и маркера доступа из идентификатора Microsoft Entra ID. Следующий код представляет собой фрагмент реализации processAADCallback метода в AuthHelper классе.

    // 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: параметры, которые необходимо задать для обмена кодом авторизации для идентификатора и (или) маркера доступа.
    • authCode: код авторизации, полученный в конечной точке перенаправления.
    • REDIRECT_URI: URI перенаправления, используемый на предыдущем шаге, должен быть передан еще раз.
    • SCOPES: области, используемые на предыдущем шаге, должны быть переданы снова.
  4. При успешном выполнении acquireToken извлекаются утверждения токена. Если проверка неисключения проходит, результаты помещаются в context экземпляр сеанса IdentityContextData и сохраняются в сеансе. Затем приложение может создать экземпляр этого из сеанса путем экземпляра IdentityContextAdapterServlet , когда ему нужен доступ:

    // 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());