OAuth 2.0 und JWT-Autorisierung in Java: in der Praxis
\n\nModerne Webanwendungen und APIs kommen selten ohne Authentifizierungs- und Autorisierungsmechanismen aus. Die beiden gängigsten Standards – OAuth 2.0 und JWT (JSON Web Token) – ermöglichen die sichere Übertragung von Benutzerdaten und die Gewährung von Zugriff auf Ressourcen. In diesem Artikel werden wir anhand eines praktischen Beispiels mit Spring Boot erläutern, wie OAuth 2.0 und JWT-Autorisierung in Java implementiert werden. Sie erfahren, wie Sie einen Autorisierungsserver einrichten, JWT-Tokens generieren und verifizieren sowie die Endpunkte Ihrer REST-API schützen.
\n\nWas sind OAuth 2.0 und JWT: Ein kurzer Überblick
\nOAuth 2.0 ist ein Protokoll für delegierten Zugriff, das es Drittanwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldedaten weiterzugeben. Es wird häufig für die Anmeldung über soziale Netzwerke (Google, Facebook) und zum Schutz von APIs verwendet.
\nJWT (JSON Web Token) ist ein kompaktes und eigenständiges Token-Format, das Informationen über den Benutzer (Claims) enthält und zur Integritätsprüfung signiert ist. JWT wird oft als Access-Token in OAuth 2.0 verwendet, da es keine Speicherung auf dem Server erfordert und leicht in HTTP-Headern übertragen werden kann.
\nIn der Praxis definiert OAuth 2.0 den Ablauf (Flow) zum Erhalten eines Tokens, während JWT das Format des Tokens selbst definiert. Zusammen bilden sie ein leistungsstarkes und sicheres Autorisierungssystem.
\n\nEinrichtung des Spring Boot-Projekts mit Abhängigkeiten
\nZunächst erstellen wir ein grundlegendes Spring Boot-Projekt. Wir werden Spring Security, Spring Web und eine Bibliothek für die Arbeit mit JWT (z. B. jjwt) verwenden.
Fügen Sie die folgenden Abhängigkeiten zu Ihrer pom.xml (Maven) oder build.gradle (Gradle) hinzu:
<!-- Maven -->\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-security</artifactId>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.3</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\nJetzt erstellen wir eine Sicherheitskonfigurationsklasse, die CSRF deaktiviert und eine Filterkette definiert.
\n\nImplementierung des Autorisierungsservers und Generierung von JWT
\nFür OAuth 2.0 benötigen wir einen Endpunkt, der die Client-Anmeldedaten entgegennimmt und ein JWT-Token zurückgibt. Im einfachsten Fall kann dies eine Simulation eines Autorisierungsservers sein.
\nErstellen wir einen Service für die Arbeit mit JWT:
\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport io.jsonwebtoken.security.Keys;\nimport org.springframework.stereotype.Service;\n\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\n@Service\npublic class JwtService {\n\n private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);\n private final long expirationMs = 3600000; // 1 Stunde\n\n public String generateToken(String username) {\n Date now = new Date();\n Date expiryDate = new Date(now.getTime() + expirationMs);\n\n return Jwts.builder()\n .subject(username)\n .issuedAt(now)\n .expiration(expiryDate)\n .signWith(secretKey)\n .compact();\n }\n\n public String