Authentification avec OAuth2
En plus de gérer les utilisateurs d'une application par nous même, on peut maintenant déléguer l'authentification à divers fournisseurs avec le protocole OAuth2. Ainsi, on peut permettre à un utilisateur de se connecter à une application avec un compte d'une autre application, comme Google, Facebook, Microsoft, GitHub et plusieurs autres.
Ecxemple avec GitHub
Dans ces notes, je crée un exemple d'authentification avec OAuth2 en utilisant GitHub.
GitHub est un des fournisseurs "communs" reconnus par le framework Spring et nous permet de créer une authentification rapidement et avec une configuration minimale. Les fournisseurs communs reconnus par Spring sont:
- GitHub
- Okta
On peut utiliser d'autres fournisseurs sans problème, mais il faudra faire plus de configuration. Pour plus d'informations, consulter la documentation officielle de Spring sur OAuth2
Configuration du projet
Pour permettre l'authentification avec OAuth2, il faudra tout d'abord ajouter la dépendance pour le client OAuth2 de Spring. Cette dépendance est disponible lors de la création d'un projet sous le groupe Security. Sinon on peut l'ajouter au fichier pom.xml.
<!-- Fichier pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security-oauth2-client</artifactId>
</dependency>
SecurityFilterChain
Voici un exemple de la configuration de la chaîne de sécurité
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(authorizeRequests -> authorizeRequests
.requestMatchers("/").permitAll()
.anyRequest().authenticated())
.oauth2Login(oauth -> oauth.defaultSuccessUrl("{l'url de votre application}"))
.build();
}
}
La seule nouveauté est l'utilisation de .oauth2Login dans la chaîne de sécurité.
Pour une application purement Java (avec des pages JSP par exemple) on peut simplement utiliser
Dans le cas d'une API, on voudra s'assurer de rediriger vers l'URL de l'application client pour éviter de tenter d'accéder à une ressource du serveur.
Configurer une application chez le fournisseur
Il faudra créer une application chez le(s) fournisseur(s) désiré(s).
Pour GitHub, la marche à suivre est la suivante:
- Se connecter à son compte GitHub.
-
Cliquer sur l'icône de profil et sur
Paramètres(Settings)
-
Au bas complètement des paramètres, trouver les paramètres de développeur (
Developper Settings)

- Sélectionner
OAuth Apps

- Créer une nouvelle application et remplir les informations nécessaires

Important: L'URL d'authorisation doit être http://localhost:8080/login/oauth2/code/github
Elle pourra éventuellement être modifiée. Une fois déployé on remplacera http://localhost:8080 par l'URL de base de l'application Java.
- On récupère ensuite l'id du client et le secret du client.

Notez bien que la première fois, vous devrez faire générer le secret. C'est à ce moment et uniquement à ce moment que vous pourrez récupérer le secret au complet. Si vous ne l'avez pas copié à ce moment, il faudra faire générer un nouveau secret.
Configurer l'appllication OAuth2 dans l'application Java
Dans le fichier application.properties, on ajoutera la configuration suivante.
spring.security.oauth2.client.registration.github.client-id{votre client id}
spring.security.oauth2.client.registration.github.client-secret={votre client secret}
C'est tout ce qui est nécessaire lorsqu'on utilise un des fournisseurs considérés comme communs de Spring.
Pour se connecter à l'aide du fournisseur, on créera un lien dans l'application client qui mènera à /oauth2/authorization/github.
Par exemple
Ceci redirigera vers l'écran de connexion de GitHub, qui demandera ensuite si vous acceptez que l'application ait accès à votre compte GitHub. Par la suite vous serez redirigé vers l'application initiale.
Utiliser d'autres fournisseurs
Pour utiliser d'autres fournisseurs la configuration de base reste très semblable. Par exemple dans le fichier application.properties, on configure les différentes informations de clients avec la syntaxe suivante:
spring.security.oauth2.client.registration.{nom_fournisseur}.client-id{votre client id}
spring.security.oauth2.client.registration.{nom_fournisseur}.client-secret={votre client secret}
L'URL d'autorisation prendra la forme http://localhost:8080/login/oauth2/code/{nom_fournisseur}
L'URL qu'on utilisera pour créer la connexion sera http://localhost:8080/oauth2/authorization/{nom_fournisseur}
Gardez en tête que chaque fournisseur a sa façon propre de créer une application OAuth et qu'il faudra donc fouiller un peu dans la documentation pour avoir la configuration adéquate pour chaque fournisseur.