JSON Web Token
JSON Web Token jest drugim najpopularniejszym obok Basic Authentication (autoryzacja z wykorzystaniem loginu i hasła) sposobem autoryzacji.
Na podstawie tokenu, który jest przechowywany po stronie klienta, można uzyskać dostęp do zasobów serwera. Najczęściej JWT jest stosowany do autoryzacji przy dostępie do API.
Budowa tokena
JSON posiada trzy kluczowe elementy:
- Header – przechowuje on informacje na temat algorytmu szyfrowania oraz typie tokena.
- Payload – dowolny przekazywany ładunek. Najczęściej są w nim przechowywane informacje na temat roli i praw użytkownika, czy też długości życia dla tokena.
- Verify – podpis cyfrowy, który składa się z zaszyfrowanego Headera i Paylodu. Stanowi on sumę kontrolną.
Token, który trafia do serwera od klienta jest parsowany, a następnie weryfikowany pod kontem prawidłowości, uprawnień, ważności, TTL i innych.
Implementacja w Spring Boot
Wykorzystanie JWT w Spring Boot jest możliwe z wykorzystaniem zależności:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> </dependency>
Przykładowa implementacja metody generującej token może wyglądać następująco:
@PostMapping("/user/login") public String login(@RequestBody User user) { Long now = System.currentTimeMillis(); return Jwts.builder() .setSubject(user.getLogin()) // 1 .claim("roles", "user") // 2 .setIssuedAt(new Date(now)) // 3 .setExpiration(new Date(now + 10000)) // 4 .signWith(SignatureAlgorithm.HS512, "secretkey").compact(); // 5 }
Do metody Post przekazywany jest użytkownik. W komentarzach z numerami 1, 2, 3, 4 tworzony jest Payload w ramach, którego dostarczone są kolejno nazwa użytkownika (Subject), uprawnienia użytkownika, początkowa ważność klucza, data wygaśnięcia klucza.
W komentarzu 5 klucz jest haszowany a następnie zamieniany do postaci ciągu tekstowego.
Prasowanie klucza odbywa poprzez wywołanie metody parseClaimsJws:
Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody();
Obiekt klasy Claims przechowują informacje przekazane w tokenie, które w następnej kolejności można zweryfikować i przetwarzać.
Materiały dodatkowe
Przykładowa aplikacja jest dostępna w serwisie GitHub:
https://github.com/bykowski/springboot-jwt
Wideo, w trakcie którego krokowo opowiadam wykorzystanie mechanizmów wraz z implementacja dostępne na kanale: