Introduction à OAuth 2.0 et à l'autorisation JWT en Java
Les applications web modernes et les API nécessitent des mécanismes d'authentification et d'autorisation robustes. Deux standards qui sont devenus de facto dans le monde du développement Java sont OAuth 2.0 et JWT (JSON Web Tokens). OAuth 2.0 fournit un protocole pour la délégation d'accès, tandis que JWT est un format compact et autonome de transmission de données. Dans cet article, nous allons voir comment combiner ces technologies en Java en utilisant Spring Security et des bibliothèques populaires.
Vous apprendrez à configurer un serveur d'autorisation, à générer et à vérifier des JWT tokens, ainsi qu'à sécuriser vos REST endpoints. Ce contenu sera utile aussi bien aux développeurs Java débutants qu'expérimentés souhaitant approfondir leurs connaissances en matière de sécurité.
Fondamentaux d'OAuth 2.0 : Flux et rôles
OAuth 2.0 définit quatre rôles : Resource Owner (propriétaire de la ressource), Client (application), Authorization Server (serveur d'autorisation) et Resource Server (serveur de ressources). Les flux (grants) les plus populaires incluent :
- Authorization Code — pour les applications web avec une partie serveur.
- Client Credentials — pour la communication serveur à serveur.
- Resource Owner Password — pour les clients de confiance (obsolète).
- Implicit — pour les SPA (déconseillé désormais).
En Java, nous pouvons implémenter un serveur OAuth 2.0 à l'aide de spring-security-oauth2-authorization-server. Examinons un exemple de configuration d'un serveur d'autorisation de base.
Configuration d'un Authorization Server avec Spring Boot
Ajoutez les dépendances dans pom.xml :
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>Créez la configuration SecurityConfig.java :
@Configuration@EnableWebSecuritypublic class SecurityConfig {
@Bean @Order(1) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); return http.build(); }
@Bean @Order(2) public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated()) .formLogin(Customizer.withDefaults()); return http.build(); }
@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient registeredClient = RegisteredClient.withId("client-id") .clientId("my-client") .clientSecret("{noop}secret") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8080/login/oauth2/code/my-client") .scope("read") .scope("write") .build(); return new InMemoryRegisteredClientRepository(registeredClient); }}JWT : Structure et génération de tokens
Un JWT se compose de trois parties : Header, Payload et Signature. Le Header contient le type de token et l'algorithme de chiffrement. Le Payload inclut les claims (revendications), telles que sub (sujet), exp (temps d'expiration) et roles. La Signature garantit l'intégrité des données.
Pour travailler avec JWT en Java, nous utilisons la bibliothèque io.jsonwebtoken:jjwt. Ajoutez la dépendance