Упражнение. Вход пользователей с помощью MSAL
В этом упражнении вы используете библиотеку проверки подлинности Майкрософт для Java (MSAL4J), чтобы добавить проверку подлинности в примере веб-приложения Java и разрешить пользователям входить с помощью учетных записей Microsoft Entra.
Пример приложения, используемого в этом упражнении, — это приложение сервлета Java, которое позволяет пользователям входить и отображать имя пользователя и основные сведения о профиле. Оно также позволяет вызывать API Microsoft Graph для отображения некоторых сведений о пользователях.
Создание веб-приложения Java
Из оболочки или командной строки:
Создайте папку для приложения.
mkdir ~/javawebapp
Клонируйте пример приложения из репозитория GitHub в новую папку.
git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
Перейдите в папку, в которой находится пример приложения для этого упражнения.
cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
Настройка веб-приложения
Чтобы настроить код, откройте проект приложения в любой среде IDE, например IntelliJ или VS Code.
Откройте файл ./src/main/resources/authentication.properties.
В свойстве
aad.authority
найдите строку{enter-your-tenant-id-here}
. Замените существующее значение значением идентификатора каталога (клиента), как показано на следующем рисунке, так как приложение было зарегистрировано в учетных записях в этом каталоге организации.В свойстве
aad.clientId
найдите строку{enter-your-client-id-here}
и замените существующее значение значением идентификатораприложения (клиента) —clientId
значением зарегистрированного приложения, скопированного из портал Azure.В свойстве
aad.secret
найдите строку{enter-your-client-secret-here}
и замените существующее значение значением ключа, сохраненным во время создания приложения в портал Azure.
Выполнение приложения
Убедитесь, что сервер Tomcat работает и у вас есть права на развертывание на нем веб-приложения. Убедитесь, что адрес узла сервера —
http://localhost:8080
.Скомпилируйте и упакуйте проект с помощью Maven:
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean package
Найдите полученный war-файл в ./target/msal4j-servlet-graph.war. Чтобы развернуть в Tomcat, скопируйте этот WAR-файлв каталог /webapps/ в каталог установки Tomcat и запустите сервер Tomcat.
Откройте браузер и перейдите по адресу
http://localhost:8080/msal4j-servlet-graph/
. Вы перенаправляетесь для входа с помощью идентификатора Microsoft Entra. При успешном входе вы увидите следующую страницу:Нажмите кнопку "Сведения о маркере идентификатора", чтобы просмотреть некоторые декодированные утверждения маркера идентификатора.
Общие сведения о коде проверки подлинности
Большую часть кода проверки подлинности можно найти в примере приложения в каталоге проекта 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.
Библиотека MSAL4J доступна в Maven. Необходимо добавить MSAL4J в качестве зависимости в файле pom.xml проекта:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.17.2</version> </dependency>
Первым шагом процесса входа является отправка запроса в конечную точку клиента
/authorize
Microsoft Entra. Для создания URL-адреса запроса авторизации используется экземпляр MSAL4JConfidentialClientApplication
. Приложение перенаправляет браузер на этот 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 по умолчанию.
-
Пользователь предоставляет запрос на вход с помощью идентификатора 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
: области, используемые на предыдущем шаге, должны быть переданы снова.
-
При успешном выполнении
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());