VOOZH about

URL: https://dzone.com/articles/jwts-with-spring-boot-and-java-9

⇱ JWTs With Spring Boot and Java 9


Related

  1. DZone
  2. Coding
  3. Frameworks
  4. JWTs With Spring Boot and Java 9

JWTs With Spring Boot and Java 9

Interested in using JWTs for your Java 9/Spring Boot projects? Learn how to set up your dependencies and the use cases for you to consider.

By Apr. 24, 18 · Tutorial
Likes
Comment
Save
34.5K Views

Join the DZone community and get the full member experience.

Join For Free

JWT (JSON Web Token) is an open source standard commonly used to transmit data between two services in a compact and secure way. This standard offers a wide range of libraries to generate JWTs and includes libraries for platforms such as .NET, Python, Node.js, Java, JavaScript, Perl, Ruby, Elixir, Golang, Groovy, and Haskell. The code is available on GitHub.

Features

  • Secure. JWTs are signed by using a secret or a public/private key pair.
  • Self-contained: all information is stored inside the JWT token. No need for further database calls.
  • Unmodifiable information, but exposed: Do not put secrets inside JWTs.
  • Compact format: JWTs are really small.

How Does It Work?

👁 Image title

  • JWTs are sent through a URL, POST parameter or inside the header.
  • Contains a payload with information about the sender, issued date, expiration date...
  • JWTs are usually generated during the authentication phase, and once the user is logged in, the JWT previously generated allows the user to access to resources without having to make additional calls to databases.
  • They can be used to exchange information between services in a secure way, making sure that was not modified during the transmission, because the signature is calculated using the header and payload.
  • The token is storage locally or in a cookie.
  • When the user wants to use the token the convention is to add it to the header in the Authorization field using the Bearer prefix followed by the token value.
Authorization: Bearer


JSON Web Token format

JWTs are structured in three parts separated by dots:

  • Header: contains the token type (jwt) and hashing algorithm like SHA256 or RSA.
  • Payload: contains claims, which are the metadata like subjects, senders, or expiration date. There are three kinds of claims: registered, public, and private.
  • Signature: the combination of header, payload, secret, and the algorithm specified in the header. The signature ensures that nothing changed.

Therefore, the format is xxx.yyy.zzz

Java Integration

Java JWT provides all you need to generate signed tokens in a Java application.

Set Up

<dependency>
 <groupId>io.jsonwebtoken</groupId>
 <artifactId>jjwt</artifactId>
 <version>0.9.0</version>
</dependency>

Generate JWT Token

String jwt = Jwts.builder()
 .setClaims(claims)
 .setSubject(email)
 .setIssuedAt(new Date())
 .setExpiration(new Date(System.currentTimeMillis()+ JWT_EXPIRATION_TIME))
 .signWith(SignatureAlgorithm.HS256, JWT_SECRET)
 .compact();


  • Issuer (iss): getIssuer() and setIssuer(String)
  • Subject (sub): getSubject() and setSubject(String)
  • Audience (aud): getAudience() and setAudience(String)
  • Expiration (exp): getExpiration() and setExpiration(Date)
  • Not Before (nbf): getNotBefore() and setNotBefore(Date)
  • Issued At (iat): getIssuedAt() and setIssuedAt(Date)
  • JWT ID (jti): getId() and setId(String)

All these parameters are available through Claims getters.

Verify JWT Token

final Claims claims = Jwts.parser()
 .setSigningKey(JWT_SECRET)
 .parseClaimsJws(compactJws)
 .getBody();

  • JWT_SECRET is the secret used when we generated the token.
  • compactJws is the JWT token pass in the header

If the verification fails, a SignatureException will be thrown. Otherwise, we will be able to store the metadata in a claims variable that will be available to consume later.

Troubleshooting

In case you are using Java 9, make sure you add an explicit dependency to the POM file.

<dependency>
 <groupId>javax.xml.bind</groupId>
 <artifactId>jaxb-api</artifactId>
</dependency>

jaxb-api is missing in Java 9, and until jjwt adds the dependency or removes the usage of JAXB classes, we have to add it manually.

JWT (JSON Web Token) Java (programming language) Spring Framework Spring Boot

Published at DZone with permission of Sergio Martin. See the original article here.

Opinions expressed by DZone contributors are their own.

Related

  • Be Punctual! Avoiding Kotlin’s lateinit In Spring Boot Testing
  • Spring Boot: How To Use Java Persistence Query Language (JPQL)
  • Distributed Tracing System (Spring Cloud Sleuth + OpenZipkin)
  • Java, Spring Boot, and MongoDB: Performance Analysis and Improvements

Partner Resources

×

Comments

The likes didn't load as expected. Please refresh the page and try again.

Let's be friends: