Ajouter la connexion avec Azure Active Directory B2C à une application web Spring
Cet article explique comment créer une application Java avec une fonctionnalité de connexion à l’aide de Spring Initializr avec l’ID Spring Boot Starter pour Microsoft Entra.
Dans ce tutoriel, vous allez apprendre à :
- Créer une application Java à l’aide de Spring Initializr
- Configurer Azure Active Directory B2C
- Sécuriser l’application avec des classes et annotations Spring Boot
- Générer et tester votre application Java
Microsoft Entra ID est la solution d’identité d’entreprise à l’échelle du cloud de Microsoft. Azure Active Directory B2C complète l’ensemble de fonctionnalités de Microsoft Entra ID, ce qui vous permet de gérer l’accès client, consommateur et citoyen à vos applications B2C (Business-to-Consumer).
Conditions préalables
- Un abonnement Azure. Si vous n’en avez pas encore, créez un compte gratuit avant de commencer.
- Kit de développement Java (JDK) pris en charge. Pour plus d’informations sur les JDK disponibles lors du développement sur Azure, consultez prise en charge de Java sur Azure et Azure Stack.
- Apache Maven, version 3.0 ou ultérieure.
Important
Spring Boot version 2.5 ou ultérieure est nécessaire pour effectuer les étapes décrites dans cet article.
Créer une application à l’aide de Spring Initializr
Accédez à https://start.spring.io/.
Remplissez les valeurs selon cette directive. Les étiquettes et la disposition peuvent différer de l’image affichée ici.
- Sous Project, sélectionnez Maven Project.
- Sous Langue, sélectionnez Java.
- Sous Spring Boot, sélectionnez 2.7.11.
- Sous groupe, Artifact et Name entrez la même valeur à l’aide d’une chaîne descriptive courte. L’interface utilisateur peut automatiquement renseigner certains de ces champs lorsque vous tapez.
- Dans le volet Dépendances, sélectionnez Ajouter des dépendances. Utilisez l’interface utilisateur pour ajouter des dépendances sur Spring Web et Spring Security.
Remarque
Spring Security 5.5.1, 5.4.7, 5.3.10 et 5.2.11 ont été publiés pour traiter le rapport CVE suivant CVE-2021-22119 : attaque par déni de service avec spring-security-oauth2-client. Si vous utilisez l’ancienne version, mettez-la à niveau.
Sélectionnez Générer un projet, puis téléchargez le projet vers un emplacement sur votre ordinateur local. Déplacez le fichier téléchargé vers un répertoire nommé après votre projet et décompressez le fichier. La disposition du fichier doit ressembler à ce qui suit, avec la valeur que vous avez entrée pour groupe à la place de
yourProject
.. ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── yourProject │ │ └── yourProject │ │ └── YourProjectApplication.java │ └── resources │ ├── application.properties │ ├── static │ └── templates └── test └── java └── yourProject └── yourProject └── YourProjectApplicationTests.java
Créer et initialiser une instance Microsoft Entra
Créer l’instance Active Directory
Connectez-vous à https://portal.azure.com.
Sélectionnez Créer une ressource. Recherchez Azure Active Directory B2C.
Sélectionnez Créer.
Sélectionnez Créer un locataire Azure AD B2C.
Pour nom de l’organisation et nom de domaine initial, fournissez les valeurs appropriées, puis sélectionnez Créer.
écran de création de locataire Azure AD B2C.
Une fois la création d’Active Directory terminée, sélectionnez votre compte dans le coin supérieur droit, sélectionnez changer de répertoire, puis sélectionnez le répertoire créé. Vous êtes redirigé vers la page d’accueil du nouveau locataire. Recherchez ensuite
b2c
et sélectionnez Azure AD B2C.
Ajouter un enregistrement d'application pour votre application Spring Boot
Dans le volet Gérer (Manage), sélectionnez Inscriptions d’applications (App registrations), puis sélectionnez Nouvelle inscription (New registration).
Dans le champ Nom, saisissez le nom de votre application, puis sélectionnez Enregistrer.
De retour dans le volet Gérer, sélectionnez Enregistrements d’applications, puis sélectionnez le nom de l’application que vous avez créée.
Sélectionnez Authentification, puis Ajouter une plateforme, puis Web. Définissez les URI de redirection sur
http://localhost:8080/login/oauth2/code/
, puis sélectionnez Configurer.
Ajouter des secrets d’application pour votre application
Sélectionnez Certificats & secrets, puis Nouveau secrets client (New client secrets). Entrez votre description de secret, puis sélectionnez Ajouter. Après avoir créé le secret, sélectionnez l’icône de copie en regard de la valeur secrète pour copier la valeur à utiliser plus loin dans cet article.
Remarque
Si vous quittez la section Certificats & secrets et y revenez plus tard, la valeur du secret n’est plus visible. Dans ce cas, vous devez créer un autre secret et le copier pour une utilisation ultérieure. Parfois, la valeur générée du secret peut contenir des caractères qui sont problématiques pour l’inclusion dans le fichier application.yml, comme une barre oblique inverse ou une apostrophe inverse. Dans ce cas, ignorez ce secret et générez-en un autre.
Ajouter un flux utilisateur
Accédez à la page principale de votre locataire. Dans la section Stratégies du volet gauche, sélectionnez Flux utilisateur, puis sélectionnez Nouveau flux d’utilisateur.
Vous quitterez maintenant ce didacticiel, exécutez un autre didacticiel et revenez à ce didacticiel lorsque vous avez terminé. Voici quelques éléments à garder à l’esprit lorsque vous accédez à l’autre tutoriel.
- Commencez par l’étape qui vous demande de sélectionner nouveau flux utilisateur.
- Lorsque ce didacticiel fait référence à
webapp1
, utilisez la valeur que vous avez entrée pour groupe à la place. - Quand vous sélectionnez des revendications à retourner à partir des flux, vérifiez que Nom complet est sélectionné. Sans cette revendication, l’application créée dans ce didacticiel ne fonctionnera pas.
- Lorsque vous êtes invité à exécuter les flux utilisateur, l’URL de redirection que vous avez spécifiée précédemment n’est pas encore active. Vous pouvez quand même exécuter les flux, mais la redirection échouera. Ceci est attendu.
- Lorsque vous atteignez « Étapes suivantes », revenez à ce didacticiel.
Suivez toutes les étapes de Tutoriel : Créer des flux utilisateur dans Azure Active Directory B2C pour créer des flux d’utilisateur pour « s’inscrire et se connecter », « modification de profil » et « réinitialisation de mot de passe ».
Azure AD B2C prend en charge les comptes locaux ainsi que les fournisseurs d’identité sociale. Pour obtenir un exemple de création d’un fournisseur d’identité GitHub, consultez Configurer l’inscription et la connexion avec un compte GitHub à l’aide d’Azure Active Directory B2C.
Configurer et compiler votre application
Maintenant que vous avez créé l’instance Azure AD B2C et certains flux d’utilisateurs, vous allez connecter votre application Spring à l’instance Azure AD B2C.
À partir de la ligne de commande, cd vers le répertoire où vous avez décompressé le fichier .zip que vous avez téléchargé à partir de Spring Initializr.
Accédez au dossier parent de votre projet, puis ouvrez le fichier projet Maven pom.xml dans un éditeur de texte.
Ajoutez les dépendances pour la sécurité de Spring OAuth2 dans pom.xml:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>See Below</version> </dependency>
Pour la
spring-cloud-azure-starter-active-directory-b2c
, utilisez la dernière version disponible. Vous pouvez peut-être utiliser mvnrepository.com pour rechercher cela.Pour la
spring-boot-starter-thymeleaf
, utilisez la version correspondant à la version de Spring Boot que vous avez sélectionnée ci-dessus, par exemple2.3.4.RELEASE
.Pour
thymeleaf-extras-springsecurity5
, utilisez la dernière version disponible. Vous pouvez peut-être utiliser mvnrepository.com pour rechercher cela. À la date de rédaction de ce texte, la dernière version est3.0.4.RELEASE
.Enregistrez et fermez le fichier pom.xml.
- Vérifiez que vos dépendances sont correctes en exécutant
mvn -DskipTests clean install
. Si vous ne voyez pasBUILD SUCCESS
, identifiez et résolvez le problème avant de continuer.
- Vérifiez que vos dépendances sont correctes en exécutant
Accédez au dossier src/main/resources dans votre projet et créez un fichier application.yml dans un éditeur de texte.
Spécifiez les paramètres de l’inscription de votre application à l’aide des valeurs que vous avez créées précédemment ; par exemple:
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/ credential: client-id: <your-application-ID> client-secret: '<secret-value>' login-flow: sign-up-or-sign-in logout-success-url: <your-logout-success-URL> user-flows: sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> profile-edit: <your-profile-edit-user-flow-name> password-reset: <your-password-reset-user-flow-name> user-name-attribute-name: <your-user-name-attribute-name>
Notez que la valeur
client-secret
est placée entre guillemets simples. Cela est nécessaire, car la valeur de<secret-value>
contiendra presque certainement certains caractères qui nécessitent d'être entre guillemets simples lorsqu'ils sont présents dans YAML.Remarque
À partir de cette écriture, la liste complète des valeurs d’intégration Spring d’Active Directory B2C disponibles pour une utilisation dans application.yml est la suivante :
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: credential: client-id: client-secret: login-flow: logout-success-url: user-flows: sign-up-or-sign-in: profile-edit: # optional password-reset: # optional user-name-attribute-name:
Le fichier application.yml est disponible dans l'exemple spring-cloud-azure-starter-active-directory-b2c : aad-b2c-web-application sur GitHub.
Enregistrez et fermez le fichier application.yml.
Créez un dossier nommé controller dans src/main/java/<yourGroupId>/<yourGroupId>, en remplaçant
<yourGroupId>
par la valeur que vous avez entrée pour Group.Créez un fichier Java nommé
WebController.java dans le dossier contrôleur deet ouvrez-le dans un éditeur de texte. Entrez le code suivant, en modifiant
yourGroupId
de manière appropriée, puis enregistrez et fermez le fichier :package yourGroupId.yourGroupId.controller; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebController { private void initializeModel(Model model, OAuth2AuthenticationToken token) { if (token != null) { final OAuth2User user = token.getPrincipal(); model.addAttribute("grant_type", user.getAuthorities()); model.addAllAttributes(user.getAttributes()); } } @GetMapping(value = "/") public String index(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } @GetMapping(value = "/greeting") public String greeting(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "greeting"; } @GetMapping(value = "/home") public String home(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } }
Étant donné que chaque méthode du contrôleur appelle
initializeModel()
, et que cette méthode appellemodel.addAllAttributes(user.getAttributes());
, toute page HTML dans src/main/resources/templates est en mesure d’accéder à l’un de ces attributs, tels que${name}
,${grant_type}
ou${auth_time}
. Les valeurs retournées paruser.getAttributes()
sont en fait les revendications de l'id_token
pour l’authentification. La liste complète des revendications disponibles figure dans Jetons d’ID de la plateforme d’identités Microsoft.Créez un dossier nommé sécurité dans src/main/java/<yourGroupId>/<yourGroupId>, en remplaçant
yourGroupId
par la valeur que vous avez saisie pour Group.Créez un fichier Java nommé
WebSecurityConfiguration.java dans le dossier de sécuritéet ouvrez-le dans un éditeur de texte. Entrez le code suivant, en modifiant
yourGroupId
de manière appropriée, puis enregistrez et fermez le fichier :package yourGroupId.yourGroupId.security; import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { private final AadB2cOidcLoginConfigurer configurer; public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) { this.configurer = configurer; } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest() .authenticated() .and() .apply(configurer) ; } }
Copiez le fichier home.html du fichier spring-cloud-azure-starter-active-directory-b2c sample: aad-b2c-web-application vers src/main/resources/templates, et remplacez les
${your-profile-edit-user-flow}
et${your-password-reset-user-flow}
par les noms des flux utilisateur que vous avez créés précédemment.
Générer et tester votre application
Ouvrez une invite de commandes et remplacez le répertoire par le dossier où se trouve le fichier pom.xml de votre application.
Générez votre application Spring Boot avec Maven et exécutez-la ; par exemple:
Remarque
Il est extrêmement important que l’heure selon l’horloge système sous laquelle l’application spring boot locale s’exécute est précise. Il existe très peu de tolérance d’asymétrie de l’horloge lors de l’utilisation d’OAuth 2.0. Même un écart de trois minutes peut provoquer l’échec de la connexion avec une erreur similaire à
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
. À la date de rédaction de cet article, time.gov offre une indication du décalage entre l’heure de votre horloge et l’heure réelle. L’application a été exécutée avec une asymétrie de +0,019 secondes.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Une fois votre application créée et démarrée par Maven, ouvrez
http://localhost:8080/
dans un navigateur web ; vous devez être redirigé vers la page de connexion.Sélectionnez le lien avec du texte relatif à la connexion. Vous devez être redirigé vers Azure AD B2C pour démarrer le processus d’authentification.
Une fois que vous vous êtes connecté avec succès, vous devriez voir l’exemple de
home page
à partir du navigateur,
Dépannage
Les sections suivantes décrivent comment résoudre certains problèmes que vous pouvez rencontrer.
Nom d’attribut manquant dans les attributs
Lors de l’exécution de l’exemple, vous pouvez obtenir une exception avec le message Missing attribute 'name' in attributes
. Le fichier de journal de cette exception ressemblera à la sortie suivante :
java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
Si vous obtenez cette erreur, vérifiez le flux de travail utilisateur que vous avez créé dans Tutoriel : Créer des flux utilisateur dans Azure Active Directory B2C. Lors de la création du flux d’utilisateur, dans Attributs utilisateur et revendications, veillez à choisir des attributs et des revendications pour le Nom d’affichage. Veillez également à configurer correctement user-name-attribute-name
dans le fichier application.yml.
Se connecter avec des boucles au point de terminaison B2C
Ce problème est probablement dû à des cookies pollués pour localhost
. Nettoyez les cookies pour localhost
et réessayez.
Résumé
Dans ce tutoriel, vous avez créé une application web Java à l’aide du démarrage Azure Active Directory B2C, configuré un nouveau locataire Azure AD B2C et inscrit une nouvelle application dans celle-ci, puis configuré votre application pour utiliser les annotations et classes Spring pour protéger l’application web.
Nettoyer les ressources
Quand vous n’en avez plus besoin, utilisez le portail Azure pour supprimer les ressources créées dans cet article pour éviter des frais inattendus.
Étapes suivantes
Pour en savoir plus sur Spring et Azure, passez au centre de documentation Spring sur Azure.