[JAVA] Connectez-vous aux applications Web Spring Boot sur la plate-forme Microsoft ID

Aperçu

La documentation officielle de Microsoft est déroutante et les mises à jour de la bibliothèque ne suivent pas, ce qui rend difficile la connexion avec un compte Azure AD [^ 1] à partir du dernier Spring Boot. Voici un résumé de ce qui se passe actuellement pour implémenter la connexion.

--Spring Boot Starter pour Azure AD ne peut pas être démarré tel quel

Conditions préalables

[Bibliothèque cliente Azure AD Spring Boot Starter pour Java (2.3.5)](https://github.com/Azure/azure-sdk-for-java/tree/407b4e0bffbb75b461c0512e669a6d43376fa7ab/sdk/spring/azure-spring-boot-starter -Active Directory)

Je pense que cette bibliothèque [^ 3] est la première à frapper. Il s'agit d'un projet dirigé par Microsoft. Puisqu'il utilise les fonctions du client Oauth2 de Spring Boot / Spring Security, il y a moins d'éléments de configuration et de plages d'implémentation que d'autres options. Les documents sur l'intégration entre Azure AD et Spring sont dispersés à divers endroits sur le site de Microsoft, mais pour le moment [Documents Github](https://github.com/Azure/azure-sdk-for-java/ Voir tree / 407b4e0bffbb75b461c0512e669a6d43376fa7ab / sdk / spring / azure-spring-boot-starter-active-directory). Ce devrait être la dernière description. Le scénario principal couvert dans cet article est le flux d'authentification backend (https://github.com/Azure/azure-sdk-for-java/tree/407b4e0bffbb75b461c0512e669a6d43376fa7ab/sdk/spring/azure-spring- boot-starter-active-directory # autorisation-code-mode-usage).

Nous allons procéder au travail basé sur ce document, mais ** Actuellement, il ne fonctionne pas avec les paramètres selon ReadMe → Il a été corrigé en fonction du rapport, mais veuillez attendre qu'il soit reflété dans maven **.

J'ai également découvert la raison rapportée sur GitHub, mais en raison de la dépendance de Spring Boot 2.3.5 La version de nimbus-jose-jwt dont dépend AAD-Starter a été mise à jour et ne peut pas être démarrée. Cela se produit depuis 8.10 dans nimbus-jose-jwt en raison de l'ajout d'un argument au constructeur defaultJWKSetCache pour spécifier le cycle d'actualisation. Tout d'abord, nous allons traiter de cela.

Remplacer les paramètres AADAuthenticationFilterAutoConfiguration pour qu'ils soient amorçables

Heureusement, la cause de ce bogue est dans la définition Bean d'AutoConfig, il est donc possible de ** le résoudre à l'exécution **. (Le code source de ce problème a été corrigé lors de la rédaction de l'article) Il n'est pas bon ici de baisser la version nimbus-jose-jwt pour la prendre en charge, mais corrigez-la et utilisez-la. Pour utiliser AAD-Starter, vous héritez essentiellement de WebSecurityConfigurerAdapter et écrivez Config, écrasez donc l'ancienne définition de Bean.

AADOAuth2LoginConfig.java


/*Ajout d'une partie de commentaire à l'exemple ReadMe*/

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AADOAuth2LoginConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;

    //Injecter les propriétés de configuration
    @Autowired
    private AADAuthenticationProperties aadAuthProps;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .oauth2Login()
            .userInfoEndpoint()
            .oidcUserService(oidcUserService);
    }

    //Définition de bean qui remplace le paramètre de problème
    @Bean
    public JWKSetCache getJWKSetCache() {
        long lifespan = aadAuthenticationProperties.getJwkSetCacheLifespan();
        return new DefaultJWKSetCache(lifespan, lifespan, TimeUnit.MILLISECONDS);
    }
}

Cette définition de bean reproduit le même comportement qu'avant la mise à niveau, mais elle contient quelques problèmes. Comme la durée de vie du cache et le cycle d'actualisation sont identiques, vous pouvez obtenir des erreurs irrégulières au moment de l'exécution [^ 4]. Pour résoudre ce problème, vous devez définir le deuxième argument de DefaultJWKSetCache sur un nombre inférieur au premier argument, et vous devez créer la propriété vous-même ou la spécifier dans votre code. De plus, il semble que le constructeur sans argument ait une durée de vie de 15 minutes et un cycle d'actualisation de 5 minutes, donc s'il ne semble y avoir aucun problème avec ce cycle, vous pouvez choisir d'utiliser le constructeur sans argument.

Enregistrez l'application avec Arue

Cela fonctionne très bien avec les paramètres tels que documentés.

Il est important de noter que l'URL de redirection doit être la valeur par défaut de Spring Security {baseURL} / login / oauth2 / code / azure. J'ai l'impression que je pourrais le changer dans les propriétés de Spring Security, mais je n'ai pas réussi. [^ 5]

Et une autre chose importante est ** l'accès à l'API donné à l'application **. Il s'agit d'un piège complet, mais le contenu du document ** nécessite des autorisations Azure AD Graph **, pas des autorisations MicroSoft Graph. 許可するAPI.png

Sur l'écran Web Azure actuel, l'affichage d'Azure AD Graph est en bas, et même si vous donnez l'autorisation de premier plan MicroSoft Graph, vous adorerez AADSTS90008, peu importe vos efforts. J'ai fait une erreur à ce sujet, mais il m'a fallu un certain temps pour le remarquer (car je suspectais un bug dans le code ...). Après avoir remarqué cela, j'ai pu contrôler les autorisations en utilisant les départements et les groupes de sécurité.

Au milieu de la description → Après vous être connecté, effectuez diverses opérations avec la fonction Graphique

J'ai épuisé mes efforts pour éviter et résoudre les problèmes de la bibliothèque, je vais donc le mettre en attente ...

Sommaire

En évitant les problèmes avec cette bibliothèque et en examinant les privilèges d'accès, j'ai pu comprendre le mécanisme de coopération entre l'authentification OAuth2 dans Spring Security et Azure AD (plateforme d'identification Microsoft). La bibliothèque cliente Azure AD Spring Boot Starter pour Java semble être considérablement mise à jour dans la prochaine version, mais elle semble avoir beaucoup de problèmes pour le moment.

Vous voudrez peut-être signaler tout problème que vous pourriez trouver dans l'enquête de la bibliothèque.

[^ 1]: la plage que j'ai évoquée est limitée aux locataires uniques Azure AD uniquement. [^ 2]: Cependant, comme le point d'accès de ce SDK est une version plus ancienne (v1.0), vous devez utiliser la version bêta lors de l'utilisation de la v2.0. [^ 3]: abrégé en AAD-Starer ci-dessous [^ 4]: Le correctif pour nimbus-jose-jwt semble également être dû à cela, et il a été partagé sur GitHub que ce correctif est ad hoc. [^ 5]: Il y a une possibilité de compréhension et de vérification insuffisantes.

Matériel de référence

Azure AD Spring Boot Starter client library for Java[^10] [^ 10]: probablement la toute dernière documentation de Starter OAuth 2.0 Sample for Azure AD Spring Boot Starter client library for Java A Java web application using Spring security which signs in users with the Microsoft identity platform [Microsoft ID Platform](Azure AD) Java Web App (fichier WAR) -Settings- 【spring-projects/spring-security】OAuth 2.0 Migration Guide Spring Security Reference12.1. OAuth 2.0 Login

Recommended Posts

Connectez-vous aux applications Web Spring Boot sur la plate-forme Microsoft ID
Configuration minimale pour exécuter l'application Spring Boot sur Azure Web Apps
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Déployer automatiquement des applications Web développées en Java à l'aide de Jenkins [Spring Boot App Edition]
WAR l'application WEB par Spring Boot et la déployer sur le serveur Tomcat
Comment ajouter un chemin de classe dans Spring Boot
Déployer l'application Spring Boot sur Elastic Beanstalk
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Comment créer un projet Spring Boot dans IntelliJ
Déployer le projet Spring Boot sur Tomcat dans XAMPP
Spring Boot sur Microsoft Azure
[Spring Boot] Création d'applications Web
Comment vérifier l'application WEB créée dans l'environnement de développement PC sur votre smartphone
[Java] Déployer l'application Spring Boot sur Azure App Service
Déployez l'application créée par Spring Boot sur Heroku (public) ②
Exemple d'application Web qui gère plusieurs bases de données avec Spring Boot 1.5
Déployez l'application créée par Spring Boot sur Heroku (public) ①
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
Développement d'applications Spring Boot dans Eclipse
Implémenter l'application Spring Boot dans Gradle
Créons une application Web de gestion de livres avec Spring Boot part1
Obtenez une instance proxy du composant lui-même dans Spring Boot
Créons une application Web de gestion de livres avec Spring Boot part3
Créons une application Web de gestion de livres avec Spring Boot part2
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
[Spring Boot] Précautions lors du développement d'une application Web avec Spring Boot et du placement d'une guerre sur un serveur Tomcat indépendant
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
Démarrez le développement d'applications Web avec Spring Boot
Volume d'essais pour créer une application Web Java sur Windows Server 2016
Comment migrer une application Web créée dans un environnement Docker local vers AWS
Exécutez l'application WEB avec Spring Boot + Thymeleaf
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
[Spring Boot] Comment obtenir des propriétés dynamiquement à partir d'une chaîne contenue dans une URL
Obtenez le chemin défini dans la classe Controller de Spring Boot sous forme de liste
Apprenez à créer un serveur WEB Introduction au développement d'applications WEB à partir des bases
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code
Exécuter un projet Spring Boot avec VS Code
Comment afficher une page Web en Java
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Conseils Java - Créez un projet Spring Boot avec Gradle
Comment se lier avec un fichier de propriétés dans Spring Boot
[Java / PostgreSQL] Connectez l'application WEB à la base de données
Créer un serveur API Web avec Spring Boot
[Spring Boot] Comment se référer au fichier de propriétés
Afficher la tâche Gradle dans le projet Spring Boot
La voie de la création d'un service Web (partie 1)
Je souhaite lire le fichier de propriétés avec un nom de fichier autre que application.yml ou application- [nom du profil] .yml avec Spring Boot
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Jusqu'à ce que vous créiez un projet Spring Boot dans Intellij et que vous le transmettiez à Github
Tirez parti de la barrière cyclique Spring AOP + pour garantir des conditions de test de verrouillage optimistes sur l'application Spring Boot
Spécifiez le codage des ressources statiques dans Spring Boot
[Introduction] Créer une application Ruby on Rails
3. Créez une base de données à laquelle accéder à partir du module Web
Comment écrire un test unitaire pour Spring Boot 2
Un mémorandum de dépendance à Spring Boot2 x Doma2
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot