Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье демонстрируется приложение Java Tomcat, которое выполняет вход пользователей и получает токен доступа для вызова Microsoft Graph. Она использует библиотеку проверки подлинности Microsoft (MSAL) для Java.
На следующей схеме показана топология приложения:
Схема, показывающая топологию приложения.
Клиентское приложение использует MSAL для Java (MSAL4J) для входа пользователя в систему и получения маркера доступа для Microsoft Graph от Microsoft Entra ID. Токен доступа подтверждает, что пользователь авторизован для доступа к конечной точке API Microsoft Graph в соответствии с областью действия.
Предварительные требования
- Java 8 или более поздней версии
- Maven 3
- Клиент идентификатора Microsoft Entra. Дополнительные сведения см. в статье Как получить арендатор Microsoft Entra ID.
- Учетная запись пользователя в вашем собственном тенанте Microsoft Entra ID, если вы хотите работать только с учетными записями в каталоге вашей организации, то есть в однотенантном режиме. Если вы еще не создали учетную запись пользователя в вашем арендаторе, сделайте это, прежде чем продолжить. Дополнительные сведения см. в статье Как создать, пригласить и удалить пользователей.
- Учетная запись пользователя в клиенте Microsoft Entra ID любой организации, если вы хотите работать с учетными записями в любом каталоге организации, то есть в мультитенантном режиме. Этот пример необходимо изменить для работы с личной учетной записью Майкрософт. Если вы еще не создали учетную запись пользователя в вашем арендаторе, сделайте это, прежде чем продолжить. Дополнительные сведения см. в статье Как создать, пригласить и удалить пользователей.
- Личная учетная запись Майкрософт, например Xbox, Hotmail, Live и т. д., если вы хотите работать с личными учетными записями Майкрософт.
- Tomcat 9
- Visual Studio Code
- Инструменты Azure для Visual Studio Code
Рекомендации
- Некоторое знакомство с Java / Jakarta Servlets.
- Некоторые знания о терминале Linux/OSX.
- jwt.ms для проверки ваших токенов.
- Fiddler для мониторинга сетевой активности и устранения неполадок.
- Подписывайтесь на блог Microsoft Entra, чтобы быть в курсе последних обновлений.
Настройка примера
В следующих разделах показано, как настроить пример приложения.
Клонирование или скачивание примера репозитория
Чтобы клонировать пример, откройте окно Bash и выполните следующую команду:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/2-Authorization-I/call-graph
Или перейдите в репозиторий ms-identity-msal-java-samples, затем скачайте его как файл .zip и распакуйте его на жесткий диск.
Внимание
Чтобы избежать ограничений длины пути к файлам в Windows, клонируйте или извлеките репозиторий в каталог рядом с корнем жесткого диска.
Регистрация примера приложения в клиенте Идентификатора Microsoft Entra
В этом примере есть один проект. В следующих разделах показано, как зарегистрировать приложение с помощью портал Azure.
Выберите клиент Идентификатора Microsoft Entra, в котором вы хотите создать приложения
Чтобы выбрать арендатора, выполните следующие действия:
Войдите в портал Azure.
Если ваша учетная запись присутствует более чем в одном клиенте Microsoft Entra ID, выберите свой профиль в углу портала Azure, а затем выберите Сменить каталог, чтобы переключить сеанс на нужный клиент Microsoft Entra ID.
Зарегистрируйте приложение (java-servlet-webapp-call-graph)
Сначала зарегистрируйте новое приложение на портале Azure, следуя инструкциям из Краткого руководства: регистрация приложения с помощью платформы удостоверений Майкрософт.
Затем выполните следующие действия, чтобы завершить регистрацию:
Перейдите на страницу Регистрация приложений платформы идентификации Microsoft для разработчиков.
Выберите Новая регистрация.
На появившейся странице Регистрация приложения введите следующие данные для регистрации приложения:
В разделе Name введите осмысленное имя приложения, которое будет отображаться пользователям приложения, — например, .
В разделе "Поддерживаемые типы учетных записей" выберите один из следующих вариантов:
- Выберите Учетные записи только в этом каталоге организации, если вы создаете приложение, предназначенное для использования только пользователями в вашем клиенте, то есть однотенантное приложение.
- Выберите Учетные записи в любом каталоге организации, если хотите, чтобы пользователи в любом клиенте Microsoft Entra ID могли использовать ваше приложение, то есть это мультитенантное приложение.
- Выберите вариант Учетные записи в любом каталоге организации и личные учетные записи Microsoft для максимально широкого круга клиентов, то есть мультитенантное приложение, которое также поддерживает личные учетные записи Microsoft.
Выберите персональные учетные записи Майкрософт для использования только пользователями личных учетных записей Майкрософт, например Hotmail, Live, Skype и Xbox.
В разделе URI перенаправления выберите Веб в раскрывающемся списке и введите следующий URI перенаправления:
Выберите Зарегистрировать, чтобы создать приложение.
На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.
Выберите Сохранить, чтобы сохранить изменения.
На странице регистрации приложения выберите сертификаты и секреты на панели навигации, чтобы открыть страницу, где можно создать секреты и отправить сертификаты.
В разделе Секреты клиента выберите Создать секрет клиента.
Введите описание — например, секрет приложения.
Выберите срок истечения действия секрета или укажите пользовательский срок его существования. Секреты клиента ограничены максимальным сроком существования 24 месяцев, и Microsoft рекомендует срок действия менее 12 месяцев. Для боевых приложений предпочтительнее использовать сертификат или учетные данные федеративной идентификации вместо секрета клиента.
Выберите Добавить. Отображается созданное значение.
Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Поэтому обязательно сохраните его в портале Azure, прежде чем перейдёте на любой другой экран или панель.
На странице регистрации приложения выберите API permissions на панели навигации, чтобы открыть страницу добавления доступа к API, необходимым вашему приложению.
Выберите Добавить разрешения.
Убедитесь, что выбрана вкладка API Майкрософт.
В разделе Часто используемые интерфейсы API Microsoft выберите Microsoft Graph.
В разделе "Делегированные разрешения" выберите User.Read из списка. При необходимости используйте поле поиска.
Выберите Добавить разрешения.
Настройте приложение (java-servlet-webapp-call-graph) для использования вашей регистрации приложения
Чтобы настроить приложение, выполните следующие действия.
Примечание.
В следующих шагах — это то же самое, что и или .
Откройте проект в интегрированной среде разработки.
Откройте файл ./src/main/resources/authentication.properties.
Найдите строку . Замените существующее значение одним из следующих значений:
- Идентификатор арендатора Microsoft Entra ID, если вы зарегистрировали приложение с параметром Только учетные записи в этом организационном каталоге.
- Слово , если вы зарегистрировали свое приложение с параметром Учетные записи в любом каталоге организации.
- Слово , если вы зарегистрировали приложение с параметром Учетные записи в любом каталоге организации и личные учетные записи Майкрософт.
- Слово , если вы зарегистрировали приложение с параметром Личные учетные записи Майкрософт.
Найдите строку и замените существующее значение на идентификатор приложения или приложения , скопированный из портала Azure.
Найдите строку и замените существующее значение на значение, сохранённое при создании приложения в портале Azure.
Соберите пример
Чтобы создать пример с помощью Maven, перейдите в каталог, содержащий файл pom.xml для примера, а затем выполните следующую команду:
mvn clean package
Эта команда создает WAR-файл , который можно запустить на различных серверах приложений.
Запустите пример
- Развертывание в Служба приложений Azure
- Запуск локально
В следующих разделах описано, как развернуть пример в Службе приложений Azure.
Предварительные требования
Плагин Maven для приложений Служба приложений Azure
Если Maven не является вашим предпочтительным средством разработки, ознакомьтесь со следующими руководствами, которые используют другие инструменты:
- IntelliJ IDEA
- Eclipse
- Visual Studio Code
Настройте плагин Maven
При развертывании в Служба приложений Azure автоматически используются учетные данные Azure из Azure CLI. Если Azure CLI не установлен локально, то плагин Maven выполняет аутентификацию с помощью OAuth или входа с помощью кода устройства. Дополнительные сведения см. в разделе аутентификация в подключаемых модулях Maven.
Чтобы настроить подключаемый модуль, выполните следующие действия.
Выполните следующую команду, чтобы настроить развертывание. Эта команда помогает настроить операционную систему службы приложение Azure, версию Java и версию Tomcat.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:configДля Создать новую конфигурацию запуска нажмите Y, затем нажмите Enter.
Для значения параметра ОС нажмите 1 для Windows или 2 для Linux, затем нажмите Enter.
Для определения значения javaVersion нажмите 2 для Java 11, затем нажмите Enter.
При появлении Define value for webContainer нажмите 4 для Tomcat 9.0, затем нажмите Enter.
Чтобы задать значение для pricingTier, нажмите Enter, чтобы выбрать уровень P1v2 по умолчанию.
Для подтверждения нажмите Y, затем нажмите Enter.
В следующем примере показаны выходные данные процесса развертывания:
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707209552268
ResourceGroup : msal4j-servlet-auth-1707209552268-rg
Region : centralus
PricingTier : P1v2
OS : Linux
Java Version: Java 11
Web server stack: Tomcat 9.0
Deploy to slot : false
Confirm (Y/N) [Y]: [INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.112 s
[INFO] Finished at: 2024-02-06T08:53:02Z
[INFO] ------------------------------------------------------------------------
После того как вы подтвердите свой выбор, плагин добавит необходимый элемент плагина и параметры в файл проекта pom.xml, чтобы настроить приложение для запуска в Служба приложений Azure.
Соответствующая часть файла pom.xml должна выглядеть примерно так:
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
Параметры конфигурации для App Service можно изменить непосредственно в pom.xml. Некоторые распространенные конфигурации перечислены в следующей таблице:
| Свойство | Обязательное поле | Описание |
|---|---|---|
subscriptionId |
false | Идентификатор подписки. |
resourceGroup |
true | Группа ресурсов Azure для приложения. |
appName |
true | Имя приложения. |
region |
false | Регион, в котором размещается приложение. Значение по умолчанию — . Допустимые регионы см. в разделе Поддерживаемые регионы. |
pricingTier |
false | Ценовая категория приложения. Значение по умолчанию для рабочей нагрузки в производственной среде — . Рекомендуемое минимальное значение для разработки и тестирования Java — . Дополнительные сведения см. в разделе Цены на службу приложений. |
runtime |
false | Конфигурация среды выполнения. Дополнительные сведения см. в разделе Сведения о конфигурации. |
deployment |
false | Конфигурация развертывания. Дополнительные сведения см. в разделе Сведения о конфигурации. |
Полный список конфигураций см. в справочной документации по подключаемым модулям. Все плагины Azure Maven имеют общий набор параметров конфигурации. Сведения об этих конфигурациях см. в разделе Общие конфигурации. Сведения о конфигурациях для Служба приложений Azure см. в разделе Приложение Azure: сведения о конфигурации.
Не забудьте сохранить отдельно значения и для дальнейшего использования.
Подготовка приложения к развертыванию
Когда вы развертываете свое приложение в App Service, URL-адрес перенаправления меняется на URL-адрес перенаправления развернутого экземпляра вашего приложения. Чтобы изменить эти параметры в файле свойств, выполните следующие действия.
Откройте файл authentication.properties вашего приложения и измените значение на доменное имя вашего развернутого приложения, как показано в следующем примере. Например, если на предыдущем шаге вы выбрали в качестве имени приложения, то теперь необходимо использовать в качестве значения . Убедитесь, что вы также изменили протокол с на .
# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<your-app-name>.azurewebsites.netПосле сохранения этого файла используйте следующую команду, чтобы перестроить приложение:
mvn clean package
Внимание
В этом же файле authentication.properties у вас есть параметр для . Не рекомендуется развертывать это значение в App Service. Также не стоит оставлять это значение в коде, чтобы случайно не отправить его в репозиторий Git. Чтобы удалить этот секрет из кода, дополнительные сведения см. в разделе Развертывание в App Service — удаление секрета. В это руководство добавлены дополнительные шаги для передачи значения секрета в Key Vault, а также для использования Key Vault References.
Обновите регистрацию приложения Microsoft Entra ID
Поскольку URI перенаправления меняется при развертывании приложения в Служба приложений Azure, вам также необходимо изменить URI перенаправления в регистрации приложения Microsoft Entra ID. Чтобы внести это изменение, выполните следующие действия:
Перейдите на страницу Регистрация приложений платформы идентификации Microsoft для разработчиков.
Используйте поле поиска, чтобы найти вашу регистрацию приложения — например, .
Откройте регистрацию приложения, выбрав его имя.
Выберите Проверка подлинности в меню.
В разделе WebRedirect URIs выберите Добавить URI.
Укажите URI приложения, добавив в конце — например, .
Выберите Сохранить.
Развертывание приложения
Теперь вы готовы развернуть приложение в службе приложение Azure. Используйте следующую команду, чтобы убедиться, что вы вошли в среду Azure для выполнения развертывания:
az login
После того как вы завершите всю настройку в файле pom.xml, вы можете использовать следующую команду для развертывания Java-приложения в Azure:
mvn package azure-webapp:deploy
После завершения развертывания ваше приложение будет доступно по адресу . Откройте URL-адрес в локальном браузере, после чего вы должны увидеть начальную страницу приложения .
Анализ примера
Чтобы изучить пример, выполните следующие действия.
- Обратите внимание, что состояние входа или выхода отображается в центре экрана.
- Выберите контекстно-зависимую кнопку в углу. При первом запуске приложения на этой кнопке отображается надпись Войти.
- На следующей странице следуйте инструкциям и войдите с учетной записью в клиенте идентификатора Microsoft Entra ID.
- На экране согласия обратите внимание на запрашиваемые области.
- Обратите внимание, что на контекстно-зависимой кнопке теперь отображается надпись Выйти, а также ваше имя пользователя.
- Выберите Сведения о маркере ID, чтобы просмотреть некоторые декодированные утверждения маркера ID.
- Выберите Call Graph, чтобы выполнить запрос к конечной точке Microsoft Graph /me endpoint и просмотреть некоторые полученные сведения о пользователе.
- Используйте кнопку в углу, чтобы выйти из системы.
О коде
В этом примере используется MSAL для Java (MSAL4J) для входа пользователя в систему и получения токена для Microsoft API Graph. Он использует Microsoft Graph SDK for Java для получения данных из Microsoft Graph. Эти библиотеки необходимо добавить в проекты с помощью Maven.
Если вы хотите воспроизвести поведение этого примера, можно скопировать файл pom.xml и содержимое папок helpers и authservlets в папке src/main/java/com/microsoft/azuresamples/msal4j. Вам также потребуется файл authentication.properties. Эти классы и файлы содержат универсальный код, который можно использовать в широком массиве приложений. Вы также можете скопировать остальную часть примера, но другие классы и файлы создаются специально для решения задачи этого примера.
Содержимое
В следующей таблице показано содержимое папки примера проекта:
| Файл или папка | Описание |
|---|---|
| src/main/java/com/microsoft/azuresamples/msal4j/callgraphwebapp/ | Этот каталог содержит классы, определяющие серверную бизнес-логику приложения. |
| src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | Этот каталог содержит классы, используемые для входа и выхода конечных точек. |
| *Servlet.java | Все доступные конечные точки определяются в классах Java с именами, заканчивающимися Servlet. |
| src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Вспомогательные классы для аутентификации. |
| AuthenticationFilter.java | Перенаправляет неаутентифицированные запросы к защищённым конечным точкам на страницу с кодом ошибки 401. |
| src/main/resources/authentication.properties | Идентификатор и конфигурация программы Microsoft Entra. |
| src/main/webapp/ | Этот каталог содержит шаблоны JSP пользовательского интерфейса |
| CHANGELOG.md | Список изменений в примере. |
| CONTRIBUTING.md | Рекомендации по участию в образце. |
| ЛИЦЕНЗИЯ | Лицензия на образец. |
ConfidentialClientApplication
Экземпляр создается в файле AuthHelper.java, как показано в следующем примере. Этот объект помогает сформировать URL-адрес авторизации Microsoft Entra ID, а также обменять токен аутентификации на токен доступа.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
Для создания экземпляра используются следующие параметры:
- Идентификатор клиента приложения.
- Секрет клиента, который является обязательным для конфиденциальных клиентских приложений.
- Центр авторизации Microsoft Entra ID, который включает идентификатор вашего клиента Microsoft Entra ID.
В этом примере эти значения считываются из файла authentication.properties с помощью средства чтения свойств в файле Config.java .
Пошаговое руководство
Ниже приведены пошаговые инструкции по функциональным возможностям приложения:
Первым шагом в процессе входа является отправка запроса к конечной точке для вашего арендатора Microsoft Entra ID. Экземпляр MSAL4J используется для формирования URL-адреса запроса на авторизацию. Приложение перенаправляет браузер на этот URL-адрес, где пользователь входит в систему.
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);В следующем списке описываются функции этого кода:
- : параметры, которые необходимо задать, чтобы сформировать .
- : Куда Microsoft Entra ID перенаправляет браузер вместе с кодом авторизации после ввода пользователем учетных данных. Он должен соответствовать URI перенаправления в регистрации приложения Microsoft Entra ID в портале Azure
- : Области действия — это разрешения, запрашиваемые приложением.
- Как правило, трех областей действия достаточно для получения ответа с токеном идентификации.
- Полный список областей, запрашиваемых приложением, можно найти в файле authentication.properties . Можно добавить дополнительные разрешения, например .
Пользователю отображается запрос на вход в систему от Microsoft Entra ID. Если попытка входа выполнена успешно, браузер пользователя перенаправляется в конечную точку перенаправления приложения. Допустимый запрос к этой конечной точке содержит код авторизации.
Затем экземпляр обменивает этот код авторизации на маркер ID и маркер доступа от Microsoft Entra ID.
// 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();В следующем списке описываются функции этого кода:
- : Параметры, которые необходимо задать, чтобы обменять код авторизации на ID и/или маркер доступа.
- : код авторизации, который был получен в конечной точке перенаправления.
- : URI перенаправления, который использовался на предыдущем шаге, необходимо снова передать.
- : Области действия, использованные на предыдущем шаге, необходимо снова передать.
Если выполнение прошло успешно, извлекаются утверждения из токена. Если проверка nonce проходит успешно, результаты помещаются в — экземпляр — и сохраняются в сессии. Затем приложение может создать экземпляр из сеанса с помощью экземпляра всякий раз, когда ему требуется доступ к нему, как показано в следующем коде:
// 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());
Защита маршрутов
Сведения о том, как пример приложения фильтрует доступ к маршрутам, см. в AuthenticationFilter.java. В файле authentication.properties свойство содержит список маршрутов, разделенных запятыми, к которым могут получать доступ только аутентифицированные пользователи, как показано в следующем примере:
# for example, /token_details requires any user to be signed in and does not require special roles or groups claim(s)
app.protect.authenticated=/token_details, /call_graph
Граф вызовов
Когда пользователь переходит к , приложение создает экземпляр из Java Graph SDK, передавая токен доступа вошедшего в систему пользователя. Клиент Graph помещает маркер доступа в заголовки своих запросов . Затем приложение просит клиента Graph вызвать конечную точку , чтобы получить сведения о пользователе, вошедшем в систему.
Если у вас уже есть действительный маркер доступа для службы Graph с областью действия , вам нужен только следующий код, чтобы получить доступ к конечной точке :
//CallGraphServlet.java
User user = GraphHelper.getGraphClient(contextAdapter).me().buildRequest().get();
Области действия
Области действия указывают Microsoft Entra ID, какой уровень доступа запрашивает приложение.
На основании запрошенных областей действия Microsoft Entra ID отображает пользователю диалоговое окно согласия при входе в систему. Если пользователь соглашается с одной или несколькими областями действия и получает токен, то согласованные области действия кодируются в полученном .
Сведения об областях, запрошенных приложением, см. в authentication.properties. По умолчанию приложение задаёт значение параметра scopes как . Эта конкретная область API Microsoft Graph предназначена для доступа к сведениям текущего пользователя, вошедшего в систему. Конечная точка Graph для доступа к этой информации: . Все допустимые запросы, отправленные к этой конечной точке, должны содержать , который содержит область действия в заголовке .
Дополнительные сведения
- Библиотека аутентификации Microsoft (MSAL) для Java
- платформа идентификации Microsoft (Microsoft Entra ID для разработчиков)
- Краткое руководство. Регистрация приложения на платформе удостоверений Майкрософт
- Общие сведения о сценариях предоставления согласия для приложений в Microsoft Entra ID
- Общие сведения о согласии пользователя и администратора
- Примеры кода MSAL