Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

JWTs With Spring Boot and Java 9

DZone's Guide to

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.

· Java Zone ·
Free Resource

Get the Edge with a Professional Java IDE. 30-day free trial.

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.

Get the Java IDE that understands code & makes developing enjoyable. Level up your code with IntelliJ IDEA. Download the free trial.

Topics:
java ,jwt ,java 9 ,spring boot ,tutorial

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}