This post walks you through the process of creating the Single Sign Out, Scalable Authentication Example with JSON Web Token (JWT), Spring Boot, Redis.

Spring Boot Hello World Series:
- Spring Boot Hello World Example with FreeMarker
- Spring Boot Hello World Example with Thymeleaf
- Spring Boot Hello World Example with JSP

What you'll build

You'll build 3 separated services:

  • 1 Authentication Service: will be deployed at localhost:8080.

  • 2 Resource Services (to simplify, we use the same code base): will be deployed at localhost:8180 and localhost:8280.

What you'll need

  • JDK 1.7+
  • Maven 3+
  • Redis

Stack

  • Java
  • Single Sign On/Out
  • JSON Web Token
  • Redis
  • Spring Boot
  • Freemarker

Authentication Service

Project structure

├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── hellokoding
│       │           └── sso
│       │               └── auth
│       │                   ├── CookieUtil.java
│       │                   ├── JwtUtil.java
│       │                   ├── LoginController.java
│       │                   ├── RedisUtil.java
│       │                   └── WebApplication.java
│       └── resources
│           └── templates
│               └── login.ftl
└── pom.xml

Project dependencies


CookieUtil

JWT Token'll be saved to and extracted from browser cookies.


cookie.setSecure(secure): secure=true => work on HTTPS only.

cookie.setHttpOnly(true): invisible to JavaScript.

cookie.setMaxAge(maxAge): maxAge=0: expire cookie now, maxAge<0: expire cookiie on browser exit.

cookie.setDomain(domain): visible to domain only.

cookie.setPath("/"): visible to all paths.

JwtUtil

We use JJWT to generate/parse JWT Token.


RedisUtil


LoginController


To simplify, we use a HashMap (credentials) as user database.

View Template


Application Configuration


Run

mvn clean spring-boot:run

Resource Service

Project structure

├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── hellokoding
│       │           └── sso
│       │               └── resource
│       │                   ├── CookieUtil.java
│       │                   ├── JwtFilter.java
│       │                   ├── JwtUtil.java
│       │                   ├── RedisUtil.java
│       │                   ├── ResourceController.java
│       │                   └── WebApplication.java
│       └── resources
│           ├── application.properties
│           └── templates
│               └── protected-resource.ftl
└── pom.xml

Project dependencies


JwtFilter

JwtFilter enforces SSO. If JWT Token's not existed (unauthenticated), redirects to Authentication Service. If JWT Token's existed (authenticated), extracts user identity and forwards the request.


ResourceController


View Template


Application Configuration



Run

Resource Service 1

mvn clean spring-boot:run -Dserver.port=8180

Resource Service 2

mvn clean spring-boot:run -Dserver.port=8280

Source code

[email protected]:hellokoding/single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker.git
https://github.com/hellokoding/single-sign-on-out-jwt-cookie-redis-java-springboot-freemarker