Einführung in OAuth 2.0 und JWT-Autorisierung mit Java
Moderne Webanwendungen und APIs erfordern zuverlässige Mechanismen für Authentifizierung und Autorisierung. Zwei Standards, die in der Java-Entwicklungswelt zum De-facto-Standard geworden sind, sind OAuth 2.0 und JWT (JSON Web Tokens). OAuth 2.0 bietet ein Protokoll zur Delegierung des Zugriffs, während JWT ein kompaktes und eigenständiges Format zur Datenübertragung darstellt. In diesem Artikel werden wir untersuchen, wie man diese Technologien mit Java unter Verwendung von Spring Security und gängigen Bibliotheken kombiniert.
Sie erfahren, wie Sie einen Autorisierungsserver einrichten, JWT-Tokens generieren und überprüfen sowie Ihre REST-Endpunkte schützen. Das Material ist sowohl für Anfänger als auch für erfahrene Java-Entwickler nützlich, die ihre Kenntnisse im Bereich Sicherheit vertiefen möchten.
Grundlagen von OAuth 2.0: Abläufe und Rollen
OAuth 2.0 definiert vier Rollen: Resource Owner (Ressourceninhaber), Client (Anwendung), Authorization Server (Autorisierungsserver) und Resource Server (Ressourcenserver). Zu den gängigsten Abläufen (Grants) gehören:
- Authorization Code — für Webanwendungen mit serverseitiger Komponente.
- Client Credentials — für Server-zu-Server-Kommunikation.
- Resource Owner Password — für vertrauenswürdige Clients (veraltet).
- Implicit — für SPAs (nicht mehr empfohlen).
Mit Java können wir einen OAuth 2.0-Server mit spring-security-oauth2-authorization-server implementieren. Betrachten wir ein Beispiel für die Konfiguration eines grundlegenden Autorisierungsservers.
Einrichtung des Authorization Server mit Spring Boot
Fügen Sie die Abhängigkeiten in pom.xml hinzu:
<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>Erstellen Sie die Konfiguration 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: Struktur und Token-Generierung
JWT besteht aus drei Teilen: Header, Payload und Signature. Der Header enthält den Tokentyp und den Verschlüsselungsalgorithmus. Die Payload enthält Claims (Aussagen) wie sub (Subjekt), exp (Ablaufzeit) und roles. Die Signatur gewährleistet die Datenintegrität.
Für die Arbeit mit JWT in Java verwenden wir die Bibliothek io.jsonwebtoken:jjwt. Fügen Sie die Abhängigkeit hinzu: