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 Spring Boot Starter pour Microsoft Entra ID.
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).
Prérequis
- Un abonnement Azure. Si vous n’en avez pas encore, créez un compte gratuit avant de commencer.
- Un kit de développement Java (JDK) pris en charge. Pour plus d’informations sur les JDK disponibles pour le 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 Initialzr
Accédez à https://start.spring.io/.
Renseignez les valeurs conformément à ce guide. Les étiquettes et la disposition peuvent différer de l’image affichée ici.
- Sous Project, sélectionnez Maven Project.
- Sous Language, sélectionnez Java.
- Sous Spring Boot, sélectionnez 2.7.11.
- Sous Group, Artifact et Name, entrez la même valeur, à l’aide d’une chaîne descriptive brève. L’interface utilisateur peut automatiquement renseigner certains de ces champs lorsque vous tapez.
- Dans le volet Dependencies, sélectionnez Add Dependencies. Utilisez l’interface utilisateur pour ajouter des dépendances envers Spring Web et Spring Security.
Remarque
Spring Security 5.5.1, 5.4.7, 5.3.10 et 5.2.11 ont été publié pour apporter une réponse au rapport CVE suivant CVE-2021-22119: Denial-of-Service attack with spring-security-oauth2-client. Si vous utilisez l’ancienne version, vous devez effectuer une mise à niveau.
Sélectionnez Generate Project, puis téléchargez le projet à un emplacement sur votre ordinateur local. Déplacez le fichier téléchargé vers un répertoire nommé d’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 Group à 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 Azure Active Directory
Connectez-vous à https://portal.azure.com.
Sélectionnez Créer une ressource. Recherchez Azure Active Directory B2C.
Sélectionnez Créer.
Cliquez sur Créer un nouveau client Azure Active Directory B2C.
Pour Nom de l’organisation et Nom de domaine initial, fournissez les valeurs appropriées, puis sélectionnez Créer.
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 une inscription d’application pour votre application Spring Boot
Dans le volet Gérer , sélectionnez Inscriptions d’applications, puis Nouvelle inscription.
Dans le champ Nom, entrez le nom de votre application, puis sélectionnez Inscrire.
De retour dans le volet Gérer, sélectionnez Inscriptions d’applications, puis sélectionnez le nom de l’application que vous avez créée.
Sélectionnez Authentification, 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
Sélectionnez Certificats et secrets, puis Nouveau secret client. Entrez la description de votre secret, puis sélectionnez Ajouter. Après avoir créé le secret, sélectionnez l’icône de copie en regard de la valeur du secret pour copier la valeur. Vous en aurez besoin plus loin dans cet article.
Remarque
Si vous quittez la section Certificats et secrets et revenez, vous ne pourrez pas voir la valeur du secret. Dans ce cas, vous devez créer une autre clé et la copier en vue d’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 d’utilisateur
Accédez à la page principale de votre locataire. Dans la section Stratégies du volet gauche, sélectionnez Flux d’utilisateurs, puis 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 à prendre en compte quand vous passerez à l’autre tutoriel.
- Commencez par l’étape qui vous invite à sélectionner Nouveau flux d’utilisateur.
- Quand ce tutoriel fait référence à
webapp1
, utilisez à la place la valeur que vous avez entrée pour Group. - Lorsque vous sélectionnez des revendications à retourner à partir des flux, vérifiez que le 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 toujours exécuter les flux, mais la redirection ne se termine pas correctement. Ceci est normal.
- Quand vous atteignez « Étapes suivantes », revenez à ce tutoriel.
Suivez toutes les étapes du 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, accédez au 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 de projet Maven pom.xml dans un éditeur de texte.
Ajoutez les dépendances associées à la sécurité Spring OAuth2 au fichier 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
spring-cloud-azure-starter-active-directory-b2c
, utilisez la version la plus récente disponible. Vous pourrez peut-être utiliser mvnrepository.com pour la rechercher.Pour
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 pourrez peut-être utiliser mvnrepository.com pour la rechercher. À la date de rédaction de cet article, la version la plus récente 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 voyezBUILD SUCCESS
pas, résolvez 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 de votre projet, puis créez un fichier application.yml dans un éditeur de texte.
Spécifiez les paramètres pour l’inscription de votre application en utilisant les valeurs que vous avez créé 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 probablement certains caractères qui doivent être placés entre des guillemets simples quand ils sont présents dans YAML.Remarque
À la date de rédaction de cet article, la liste complète des valeurs d’intégration de Spring Active Directory B2C qui peuvent être utilisées 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é contrôleur dans src/main/java/<yourGroupId/yourGroupId>>,< en
<yourGroupId>
remplaçant par la valeur que vous avez entrée pour Groupe.Créez un fichier Java nommé WebController.java dans le dossier controller, puis 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 peut accéder à n’importe lequel de ces attributs, par exemple${name}
,${grant_type}
ou${auth_time}
. Les valeurs retournées à partir deuser.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
yourGroupId
remplaçant par la valeur que vous avez entrée pour Group.Créez un fichier Java nommé WebSecurityConfiguration.java dans le dossier security, puis 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 à partir de spring-cloud-azure-starter-active-directory-b2c : aad-b2c-web-application vers src/main/resources/templates, puis remplacez les
${your-profile-edit-user-flow}
${your-password-reset-user-flow}
flux utilisateur que vous avez créés précédemment.
Générer et tester votre application
Ouvrez une invite de commandes, puis définissez le répertoire sur le dossier hébergeant le fichier pom.xml de votre application.
Générez votre application Spring Boot avec Maven, puis exécutez-la. Par exemple :
Remarque
Il est extrêmement important que l’heure de l’horloge système sous laquelle l’application Spring Boot locale s’exécute soit précise. Il y a très peu de tolérance de décalage 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 correctement avec un décalage de + 0,019 seconde.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Une fois que votre application est créée et démarrée dans Maven, ouvrez
http://localhost:8080/
dans un navigateur web ; vous devez être redirigé vers la page de connexion.Sélectionnez le lien avec le 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 devez voir l’exemple
home page
à partir du navigateur,
Dépannage
Les sections suivantes décrivent comment résoudre certains problèmes qui peuvent se présenter.
Nom d’attribut manquant dans les attributs
Quand vous exécutez l’exemple, vous pouvez recevoir une exception avec le message Missing attribute 'name' in attributes
. Le journal de cette exception ressemble à 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 recevez cette erreur, vérifiez le flux d’utilisateur que vous avez créé dans Tutoriel : Créer des flux d’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ée une application web Java avec l’application de démarrage Azure Active Directory B2C, configuré un nouveau locataire Azure AD B2C et inscrit une nouvelle application, puis vous avez 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 des ressources créées dans le cadre de cet article, utilisez le portail Azure pour les supprimer afin d’éviter des frais imprévus.
Étapes suivantes
Pour en savoir plus sur Spring et Azure, poursuivez vers le centre de documentation Spring sur Azure.