w ,

FajneFajne Dobre!Dobre! ŚwietnieŚwietnie Że co?Że co? WnerwWnerw SmuteczekSmuteczek

JSON Web Token w Spring Boot

jwt
jwt

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:

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

docker

Docker dla programistów – od podstaw

Docker od podstaw

Docker – budowa obrazu dla aplikacji w Spring Boot